java - 使用带索引的流将 java 列表转换为映射

标签 java

我正在尝试学习如何使用 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/

相关文章:

java - 泄漏了最初在此处添加的窗口 com.android.internal.policy.impl.PhoneWindow$DecorView{b5596468 V.E..... R.....ID 0,0-456,144}

java - 在 JSF 中调用 JAX-WS

java - 是否值得合并 byte[] 和 char[] 数组,还是只创建更好

java - 使用 Eclipse 启动 JSF 项目

java - 如何从外部jsp调用内部类方法或变量?

java - 刷新<s :select> tag on changing backing Java collection in Struts 2

java - Android XML 布局错误

java - iOS : Write ByteArray ( [Int8] ) to a file in swift 4

java - 如何在Java中设置Oracle编码

java - 无法从外部库加载主类 list 属性