Java流同时计算多个项目

Am1*_*3zA 5 java count filter 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();
Run Code Online (Sandbox Code Playgroud)

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

某种东西,它返回一个Map或对象列表.

Tun*_*aki 10

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

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

这将返回一个Map键,其中键是速率,值是具有该速率的列表中的元素数.然后,它只是得到的事情"Low","Medium"和"High"钥匙.

groupingBy(classifier, downstream)是一个收集器,它根据给定的分类器(在这里,它是MyClass::getRate)对元素进行分组,并使用下游收集器(这里,它counting())对值进行减少.

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

import static java.util.stream.Collectors.counting;
import static java.util.stream.Collectors.groupingBy;
Run Code Online (Sandbox Code Playgroud)