我正在尝试学习如何使用 Java 8 集合,我想知道是否有一种方法可以使用 java 流将我的列表转换为 map 。
List<PrimaryCareDTO> batchList = new ArrayList<>();
PrimaryCareDTO obj = new PrimaryCareDTO();
obj.setProviderId("123");
obj.setLocatorCode("abc");
batchList.add(obj);
obj = new PrimaryCareDTO();
obj.setProviderId("456");
obj.setLocatorCode("def");
batchList.add(obj);
我想知道如何使用流将上面的列表创建到 map 中。我知道如何将 foreach 等与 put 一起使用,但我只是想知道是否有一种更优雅的方法来使用流构建 map 。 (我知道下面的语法不正确,我是流新手,不知道如何编写)
AtomicInteger index = new AtomicInteger(0);
Map<String, Object> result = batchList.stream()
.map("providerId" + index.getAndIncrement(), PrimaryCareDTO::getProviderId)
.map("locatorCode" + index.get(), PrimaryCareDTO::getLocatorCode);
目标是代表以下内容。
Map<String, Object> map = new HashMap<>();
//Group a
map.put("providerId1", "123");
map.put("locatorCode1", "abc");
//Group b
map.put("providerId2", "456");
map.put("locatorCode2", "def");
最佳答案
...
import java.util.AbstractMap.SimpleImmutableEntry;
import java.util.Map.Entry;
...
AtomicInteger index = new AtomicInteger(0);
List<SimpleEntry<String, String>> providerIds =
batchList.stream()
.map(e -> new SimpleEntry<>("providerId" + index.incrementAndGet(), e.getProviderId()))
.collect(Collectors.toList());
index.set(0);
List<SimpleEntry<String, String>> locatorCodes =
batchList.stream()
.map(e -> new SimpleEntry<>("locatorCode" + index.incrementAndGet(), e.getLocatorCode()))
.collect(Collectors.toList());
Map<String, String> map = Stream.of(providerIds,
locatorCodes)
.flatMap(e -> e.stream())
.collect(Collectors.toMap(Entry::getKey, Entry::getValue));
首先,它创建两个列表,使用Entry
(来自Map
)来表示字符串-字符串元组:
- 以元组
providerId#
作为“键”的列表,其值例如“123”
- 以元组
locatorCode#
作为“键”的列表,其值例如“abc”
然后,它创建一个包含这两个列表作为“元素”的流,然后将其与 flatMap()
连接起来以获得 Entry
的单个长流,
(前两个无法保持流,而我必须通过 List
并返回流的原因是因为 index.incrementAndGet()
的两次调用否则,只有在使用流时才会进行评估,即在 index.set(0);
之后。)
然后,它使用计数器创建新的键值对,并将它们放入映射中(使用Collectors.toMap()
。
关于java - 使用带索引的流将 java 列表转换为映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52781208/