【问题标题】:Extract multiple values from a single Java stream从单个 Java 流中提取多个值
【发布时间】:2020-02-11 15:25:16
【问题描述】:

我必须从自定义对象的List 中提取两个值( min 和 max ),目前我正在创建两次流并分别提取它。我认为使用单个流并使用 map 或类似函数在单个流中获取最小值和最大值可能是一种优化。这可行吗?

public class MyClass {

    public static class MyC {
        double val;
        public MyC(double val) {
            this.val = val;
        }

        public double getVal() {return val;}
    }

    public static void main(String[] args) {


        List<MyC> list = new ArrayList<>();
        list.add(new MyC(10.0d));
        list.add(new MyC(20.0d));

        double min = Optional.ofNullable(list).stream()
                        .flatMap(List::stream)
                        .limit(13)
                        .map(MyC::getVal)
                        .min(Double::compare)
                        .orElse(getMinDefault());

        double max = Optional.ofNullable(list).stream()
                .flatMap(List::stream)
                .limit(13)
                .map(MyC::getVal)
                .max(Double::compare)
                .orElse(getMaxDefault());

    }

    private static double getMinDefault() {
        return 1.0d;
    }

    private static double getMaxDefault() {
        return 20.0d;
    }
}

【问题讨论】:

标签: java performance java-stream


【解决方案1】:

您可以将DoubleSummaryStatistics 用于值属性的maxmin

DoubleSummaryStatistics summaryStatistics = list // avoid initialising list as 'null'
        .stream()
        .limit(13)
        .mapToDouble(MyC::getVal)
        .summaryStatistics();
double max = summaryStatistics.getMax();
double min = summaryStatistics.getMin();

关于要依赖的自定义默认值,您可以使用条件逻辑,例如:

double max = getMaxDefault();
double min = getMinDefault();
if (!list.isEmpty()) {
    DoubleSummaryStatistics summaryStatistics = list
            .stream()
            .limit(13)
            .mapToDouble(MyC::getVal)
            .summaryStatistics();

    max = summaryStatistics.getMax();
    min = summaryStatistics.getMin();
}

【讨论】:

  • 这非常接近,但是如果您看到我的回复,orElse 的最大值和最小值有不同的默认值,我该如何在这里做类似的事情?
  • @NoviceUser 在答案中更新,最好将其作为条件分支处理,而不是在此处使用Optional
猜你喜欢
  • 2010-09-17
  • 1970-01-01
  • 2016-10-24
  • 1970-01-01
  • 2012-01-18
  • 2012-06-04
  • 1970-01-01
  • 2012-12-14
  • 1970-01-01
相关资源
最近更新 更多