当前位置: 首页 > 知识库问答 >
问题:

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

刁远
2023-03-14

我正在尝试学习如何使用Java 8的集合,我想知道是否有一种方法将我的列表转换成一个地图使用Java流。

    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);

我想知道如何使用流将上面的列表创建到一个映射中。我知道如何将foreach etc与puts一起使用,但我只是想知道是否有更优雅的方法使用流构建映射。(我知道下面的语法不正确,我是流的新手,不知道怎么写)

    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");

共有1个答案

孙胜泫
2023-03-14
...
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流,

(前两个不能保持流,而我必须通过列表并返回到流的原因是,否则index.IncrementAndGet()的两个调用只有在使用流时才会被计算,这是在index.set(0);之后。)

然后使用计数器创建新的键值对,并将它们放入映射(使用collectors.tomap()

 类似资料:
  • 我已经创建了一种计算字母表中每个字符的方法。我正在学习流(函数式编程),并尝试尽可能经常地使用它们,但我不知道在这种情况下该怎么做:

  • 如何从字符串列表中获取映射,其中索引是键,字符串是值? 如果我有这样的名单 我想要一张< code >地图 当我执行以下操作时,我得到一个错误 错误 所需类型:int提供:Object 当我将其转换为int或Integer时 我明白了 收集(java.util.function.Supplierjava.util.function.ObjIntConsumerjava.util.function.

  • 我有下面的pojo 此employee类用于从mybatis orm获取对象列表(list)。 mybatis将输出作为列表返回,因为mybatis不支持将Map作为返回类型 我必须把它转换成地图 我尝试了下面的方法,但没有成功,因为它需要getName()和getId()方法 请告知是否有一种方法可以在不修改员工pojo的情况下使用stream实现。 注意:我知道我们可以使用ofr或for ea

  • 问题内容: 我创建了一种计算字母数字的方法。我正在学习流(函数式编程)并尝试尽可能多地使用它们,但是在这种情况下,我不知道该怎么做: 那么,如何使用Java 8流重写它呢? 问题答案: 避免使用有状态的索引计数器,如其他答案中所述的基于-解决方案。如果流是并行的,它们将失败。相反,流式传输索引: 上面假设传入列表是字母,因此不应包含重复的字符。如果您有可能重复元素,则多个元素将映射到同一键,然后需

  • 我有一个lambda表达式,我想在其中创建一个对象列表,但我得到了错误 错误 我希望作为lambda表达式的返回类型。我怎样才能做到呢?

  • 我想把列表转换成地图使用作为关键值只有两个字符串值。然后作为值,从输入列表中只列出包含奇数或偶数索引位置的元素的字符串列表。以下是旧的时尚代码: 如何使用流将此代码转换为Java8以获得此结果? 我目前的混乱尝试需要修改列表的元素,但肯定是更好的选择。 或者也许有人帮我解决这个不正确的问题? 返回以下内容: