[英]Java8 streams and filters
我有一个set multimap,它存储了一个月的一些字符串(整数)。
MonthlyCount = {1:["hello"],2:["hello","hi"]}
我有一个地图,计算每月的字符串数量并添加它们。 我使用containsKey过滤器来检查密钥是否存在于集合中,并将它们添加到地图中。
final String[] months = new DateFormatSymbols().getShortMonths();
final Map<String, Object> metaData = new LinkedHashMap<>();
private SetMultimap<Integer, String> MonthlyCount;
for (int i = 0; i <= month; i++) {
final int count = MonthlyCount.containsKey(i + 1) ? MonthlyCount.get(i + 1).size() : 0;
metaData.put(months[i], count);
}
有没有办法用Java8的流和过滤器实现相同的行为?
您可以使用IntStream
迭代所需范围并使用Collectors.toMap
生成所需的映射:
Map<String,Integer> map =
IntStream.range(0,months.length)
.boxed()
.collect(Collectors.toMap(i->months[i],
i->MonthlyCount.containsKey(i + 1) ? MonthlyCount.get(i + 1).size() : 0));
请注意,您正在做不必要的工作。 看看SetMultimap.get
:
返回与此多图中的
key
关联的值的视图集合(如果有)。 请注意,当containsKey(key)
为false时,返回空集合,而不是null
。
所以你需要在你的循环中做的就是
metaData.put(months[i], MonthlyCount.get(i + 1).size());
因为无论如何它对于缺席键都是零。 如果您有一个非番石榴Map<…,Set<…>>
,您可以在Java 8中执行等效操作:
metaData.put(months[i], MonthlyCount.getOrDefault(i + 1, emptySet()).size());
其中emptySet()
是Collections.emptySet()
的静态导入。
当您想要添加到现有Map
时,我不会重写循环以使用流。 毕竟,代码足够简洁
for(int i=0; i<month.length; i++)
metaData.put(months[i], MonthlyCount.get(i + 1).size());
流不会变得更好......
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.