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