繁体   English   中英

Java8流和过滤器

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM