Java8流和过滤器

Java8流和过滤器,java,java-8,guava,java-stream,Java,Java 8,Guava,Java Stream,我有一个集合多重映射,它根据一个月(整数)存储一些字符串 我有一个地图,它统计每个月的字符串数量并将它们相加。我使用containsKey过滤器检查密钥是否存在于集合中,并将它们添加到映射中 final String[] months = new DateFormatSymbols().getShortMonths(); final Map<String, Object> metaData = new LinkedHashMap<>(); private SetMulti

我有一个集合多重映射,它根据一个月(整数)存储一些字符串

我有一个地图,它统计每个月的字符串数量并将它们相加。我使用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);
}
final String[]months=new DateFormatSymbols().getShortMonths();
最终映射元数据=新建LinkedHashMap();
私有SetMultimap MonthlyCount;

对于(inti=0;i您可以使用
IntStream
在所需范围内迭代,并使用
collector.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));
地图=
IntStream.range(0,月.长度)
.boxed()
.collect(收集器.toMap(i->months[i],
i->MonthlyCount.containsKey(i+1)?MonthlyCount.get(i+1.size():0));

请注意,您正在做不必要的工作。请查看:

返回与此多重映射中的
key
关联的值的视图集合(如果有)。请注意,当
containsKey(key)
为false时,将返回空集合,而不是
null

所以在循环中,你需要做的就是

metaData.put(months[i], MonthlyCount.get(i + 1).size());
因为对于缺少的键,它将是零。如果您有一个非番石榴
映射
,您可以在Java 8中执行一个等效的操作:

metaData.put(months[i], MonthlyCount.getOrDefault(i + 1, emptySet()).size());
其中
emptySet()
集合的静态导入。emptySet()

当您想要添加到现有的
映射时,我不会重写循环以使用流。毕竟,代码足够简洁

for(int i=0; i<month.length; i++)
    metaData.put(months[i], MonthlyCount.get(i + 1).size());

用于(int i=0;i@Tania我认为它可能在没有装箱的情况下工作,但是您可以通过装箱流来轻松修复它。请参阅edit@Tania我尝试了类似的代码,效果很好。如果您喜欢,可以将地图类型更改为
Map
。@Tania我刚刚注意到您的代码引用了两个地图-
ticketsByMonthMap
MonthlyCount
,但只声明了其中一个。这可能是您的问题。如果两个不同的映射名称不是故意的,那么使用
map.getOrDefault
比将循环转换为流(即
MonthlyCount.getOrDefault(i+1,emptySet()).size()更能改进代码…@ TANIA:你的意思是把它分配给一个现存的map变量吗?是的。为什么你在操作的中间显然要访问另一个地图?什么是<代码> TigKeSyMythmap?<代码>,为什么你要检查代码中存在的密钥?感谢您指出这一点。更改了它。与此用例中的集合相比,流是否提高了性能?@Tania否,流的性能并不比非流代码好。
for(int i=0; i<month.length; i++)
    metaData.put(months[i], MonthlyCount.get(i + 1).size());