java - 如何根据 Java 8 Stream 过滤器的输出计算百分比

标签 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 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(Date, Long),其中包含以下内容:
今天,2
昨天,1

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

提前致谢。

最佳答案

Average as double 可以这样做:

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);
}

作为字符串:

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);
}

关于java - 如何根据 Java 8 Stream 过滤器的输出计算百分比,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24874256/

相关文章:

c# - 使用 ForEach 语句修改列表的元素

c# - 如何检查 C# lambda 表达式是否为 "empty"?

java - 如何在preparedstatement中使用JDBC通配符创建mysql表

java - 将具有给定偏移量的日期时间转换为 UTC Java

java - 如何将 JAVA 8 后端链接到 Angular 前端?

java - JAVA 8 中的 CMSMarkStackSizeMax 参数

c++ - 奇怪的 "Could not deduce template argument for ' T'"错误

java - hadoop mapreduce模型java

Java 音频流关闭错误

java - JVM 使用的堆比最大堆多很多