Java流同时计算多个项目

时间:2015-10-28 19:04:34

标签: java filter count java-8 java-stream

我有一个非常大的对象列表,我想根据其中一个属性计算对象数。我现在拥有的是:

long low = myList.stream().filter(p -> p.getRate().equals("Low")).count(); 
long medium = myList.stream().filter(p -> p.getRate().equals("Medium")).count();    
long high = myList.stream().filter(p -> p.getRate().equals("High")).count();

我不确定Java 8如何处理这个但我担心表演!无论如何,我可以在一次通话中统计这3个属性吗?为了提高绩效?

返回Map或对象列表的东西。

1 个答案:

答案 0 :(得分:10)

您可以按照每个对象的比率对List进行分组,并计算出现的次数。假设您的对象属于MyClass类型:

Map<String, Long> map = myList.stream().collect(groupingBy(MyClass::getRate, counting()));

这将返回Map,其中键是速率,值是具有该速率的列表中的元素数。然后,只需获取"Low""Medium""High"密钥即可。

groupingBy(classifier, downstream)是一个收集器,它根据给定的分类器(此处为MyClass::getRate)对元素进行分组,并使用下游收集器对值进行缩减(此处为counting() })。

注意:编译代码需要以下静态导入:

import static java.util.stream.Collectors.counting;
import static java.util.stream.Collectors.groupingBy;
相关问题