我有一个非常大的对象列表,我想根据其中一个属性计算对象数。我现在拥有的是:
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或对象列表的东西。
答案 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;