如何根据Java8流过滤器的输出计算百分比

如何根据Java8流过滤器的输出计算百分比,java,java-8,lambda,Java,Java 8,Lambda,我想获取一个作业列表(称为resultStream)并计算完全完成的作业的百分比 public class Job { private Date date; private String success; // Getter and setter and constructor. } 该列表包含以下内容: new Job("TODAY", "YES"); new Job("TODAY", "YES"); new Job("YESTERDAY", "YES"); new

我想获取一个作业列表(称为resultStream)并计算完全完成的作业的百分比

public class Job {
    private Date date;
    private String success;

    // Getter and setter and constructor.
}
该列表包含以下内容:

new Job("TODAY", "YES");
new Job("TODAY", "YES");
new Job("YESTERDAY", "YES");
new Job("TODAY", "NO");
以下是我目前掌握的代码:

resultStream.stream().parallel().filter(result -> {
   if ("YES".contains(result.getSuccess())) {
       return true;         
   } else {
       return false;
   }
}).collect(groupingBy(Job::getDate, HashMap::new, counting()));
这将返回一个HashMap(日期,长),其中包含以下内容:
今天,2
昨天,1

我实际上想要以下结果:
今天,66%
昨天,100%


提前感谢。

平均值为双倍可以这样做:

public static void main(final String... args) {
    final List<Job> jobs = new ArrayList<>();
    jobs.add(new Job(LocalDate.now(), "YES"));
    jobs.add(new Job(LocalDate.now(), "NO"));
    jobs.add(new Job(LocalDate.now(), "YES"));
    jobs.add(new Job(LocalDate.now()
            .minusDays(1), "YES"));

    final Map<LocalDate, Double> result = jobs.stream()
        .collect(
                    Collectors.groupingBy(Job::getDate,
                            Collectors.mapping(Job::getSuccess, Collectors.averagingDouble(success -> {
                                return "YES".equals(success) ? 1 : 0;
                            }))));

    // result = {2014-07-20=1.0, 2014-07-21=0.6666666666666666}
    System.out.println(result);
}
publicstaticvoidmain(最终字符串…args){
最终列表作业=新建ArrayList();
jobs.add(新作业(LocalDate.now(),“YES”);
jobs.add(新作业(LocalDate.now(),“NO”);
jobs.add(新作业(LocalDate.now(),“YES”);
jobs.add(新作业(LocalDate.now)()
.第(1)天,“是”);
最终映射结果=jobs.stream()
.收集(
Collectors.groupingBy(作业::getDate,
Collectors.mapping(作业::getSuccess,Collectors.averagingDouble(成功->{
返回“是”。等于(成功)?1:0;
}))));
//结果={2014-07-20=1.0,2014-07-21=0.6666}
系统输出打印项次(结果);
}
作为字符串:

public static void main(final String... args) {
    final List<Job> jobs = new ArrayList<>();
    jobs.add(new Job(LocalDate.now(), "YES"));
    jobs.add(new Job(LocalDate.now(), "NO"));
    jobs.add(new Job(LocalDate.now(), "YES"));
    jobs.add(new Job(LocalDate.now()
            .minusDays(1), "YES"));

    final Map<LocalDate, String> result = jobs.stream()
            .collect(
                    Collectors.groupingBy(
                            Job::getDate,
                            Collectors.collectingAndThen(
                                    Collectors.mapping(Job::getSuccess, Collectors.averagingDouble(success -> {
                                        return "YES".equals(success) ? 1 : 0;
                                    })), avg -> String.format("%,.0f%%", avg * 100))));
    // result = {2014-07-20=100%, 2014-07-21=67%}
    System.out.println(result);
}
publicstaticvoidmain(最终字符串…args){
最终列表作业=新建ArrayList();
jobs.add(新作业(LocalDate.now(),“YES”);
jobs.add(新作业(LocalDate.now(),“NO”);
jobs.add(新作业(LocalDate.now(),“YES”);
jobs.add(新作业(LocalDate.now)()
.第(1)天,“是”);
最终映射结果=jobs.stream()
.收集(
收集者分组(
作业::getDate,
收藏,收藏,然后(
Collectors.mapping(作业::getSuccess,Collectors.averagingDouble(成功->{
返回“是”。等于(成功)?1:0;
})),avg->String.format(“%,.0f%%”,avg*100));
//结果={2014-07-20=100%,2014-07-21=67%}
系统输出打印项次(结果);
}

顺便说一句,你的过滤器实际上应该说
result->“YES”。contains(result.getSuccess())
+1在我看来不错。平均an是处理这类布尔函数的方法。+1,我希望有人能证明我错了:)顺便说一句,你可以用
averagingDouble
中的表达式替换lambda块。这段代码为你编译吗?我在IntelliJ中得到一个错误,说“avg”是一个对象,运算符“*”不能应用于avg。当场。这是我的IntelliJ版本的一个问题。最新版本13.1.4修复了该问题。