通过使用Java Stream分组后应用函数逐月获取速率

时间:2016-06-26 18:56:54

标签: java java-8 java-stream

我有一个这样的考试表:

[1, 1.00]
[2, 0.75]
[3, 0.33]

这应该是我的整数地图,十进制数'流后的结果:

月,费率

Collectors.counting()

费率=通过/通过+失败

现在我有以下代码可以使用,但我必须使用Rate公式更改repository.findAllLastYearExames() .stream().collect(Collectors.groupingBy(Exam::getMonthExam, Collectors.counting()));

{{1}}

1 个答案:

答案 0 :(得分:1)

这样做的一种方法是首先过滤状态未通过或未通过的考试,然后使用averagingDouble,您将为通过的考试返回1,为未通过的考试返回0计算平均值。

import static java.util.stream.Collectors.averagingDouble;
import static java.util.stream.Collectors.groupingBy;

...

Map<Integer, Double> map =
     examList.stream()
             //or filter to have a status that is either PASS or FAIL instead
             .filter(e -> e.getStatus() != Exam.Status.ABSENCE)
             .collect(groupingBy(Exam::getMonthExam, 
                                 averagingDouble(e -> e.getStatus() == Exam.Status.PASS ? 1 : 0)));