代码之家  ›  专栏  ›  技术社区  ›  Novice User

从单个java流中提取多个值

  •  1
  • Novice User  · 技术社区  · 5 年前

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

    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;
        }
    }
    
    1 回复  |  直到 5 年前
        1
  •  3
  •   Naman    5 年前

    你可以用 DoubleSummaryStatistics 对于两个 max min 你的价值属性。

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