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

时间:2018-10-12 14:02:09

标签: java

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

我想知道如何使用流将上面的列表创建到地图中。我知道如何将puteach等与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");

2 个答案:

答案 0 :(得分:1)

...
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()

答案 1 :(得分:0)

要添加两个要映射的属性,您将不得不蒸两次

> cat test_perl.pl
#!/usr/bin/perl
use strict;
use warnings;
while ( "cat 11052000 cow_and_owner_ 01011999 12031981 dog 22032011" =~ m/([a-z_]+)\s+([0-9 ]+)/g )
{
print "$1:$2\n";
}
> test_perl.pl
cat:11052000
cow_and_owner_:01011999 12031981
dog:22032011
>