zoukankan      html  css  js  c++  java
  • java8 array、list操作 汇【5】)- Java8 Lambda list统计(求和、最大、最小、平均)

     

     关于stream使用的好文推荐:
    这里去看了ibm的一篇关于stream的文章,get到了不少stream还没遇到过的用法。老铁们可以去学习一下。[https://www.ibm.com/developerworks/cn/java/j-lo-java8streamapi/ ]

    public class Test {
        public static void main(String[] args) {
            List<Student> list1 = Arrays.asList(
                    new Student(1, "t1", 1, BigDecimal.valueOf(1.5), 10d, "1"),
                    new Student(2, "t2", 2, BigDecimal.valueOf(2.5), 20d, "2"),
                    new Student(3, "t3", 2, BigDecimal.valueOf(3.5), 30d, "2"));
    
    
            //★★★★ 注意此写法:  .reduce((sum1, i) -> sum1 + i)
    
            // 新方法:可以用内建方法,也可以自己定义
            //Map和Reduce操作是函数式编程的核心操作,因为其功能,reduce 又被称为折叠操作。
            //SQL中类似 sum()、avg() 或者 count() 的聚集函数,实际上就是 reduce 操作,因为它们接收多个值并返回一个值。
            //流API定义的 reduceh() 函数可以接受lambda表达式,并对所有值进行合并。
            // IntStream这样的类有类似 average()、count()、sum() 的内建方法来做 reduce 操作,也有mapToLong()、mapToDouble() 方法来做转换。
            double bill = list1.stream()
                    .map((i) -> i.price2 + 0.12 * i.price2)
                    .reduce((sum1, i) -> sum1 + i)
                    .get();
            // 为每个price2加上12%的税
    
    
            //mapToInt
            int sum1 = list1.stream()
                    .mapToInt(p -> p.unit)
                    .sum();
            System.out.println("--00->" + sum1);
    
            //mapToInt - nax 获取分享数
            Integer shareTatol = list1
                    .stream()
                    .mapToInt(Student::getId)
                    .max()
                    .orElse(0);
            System.out.println("--01->" + shareTatol);
    
            //null到时候,给默认值0.0
            Double reduce = list1.stream()
                    .reduce(0.0, (x, y) -> x + (y.getPrice2() * y.getUnit()), Double::sum);
            System.out.println("--02->" + reduce);
    
            //
            Integer integer = list1.stream()
                    .map(Student::getUnit)
                    .max((x, y) -> Float.compare(x, y))
                    .get();
            System.out.println("--03->" + integer);
    
            //从小到大分数排序:
            list1.stream()
                    .map(Student::getUnit).sorted((x, y) -> Float.compare(x, y));
            double average = list1.stream()
                    .map(Student::getPrice2).reduce(0.0, Double::sum) / list1.size();
            long count1 = list1.stream()
                    .map(Student::getUnit).filter(r -> r > average).count();
            System.out.println("--035-高于平均值的有多少个:-->" + count1);
    
            //最大值,最小值,平均值
            // 为啥返回Optional? 如果stream为null怎么办, 这时候Optinal就很有意义了
            Optional<Student> mostCalorieDish = list1.stream().max(Comparator.comparingInt(Student::getUnit));
            Optional<Student> minCalorieDish = list1.stream().min(Comparator.comparingInt(Student::getUnit));
            Double avgCalories = list1.stream().collect(Collectors.averagingInt(Student::getUnit));
            System.out.println("--04->" + mostCalorieDish);
            System.out.println("--05->" + minCalorieDish);
            System.out.println("--06->" + avgCalories);
    
            // Collectors.maxBy 和 Collectors.minBy 来计算流中的最大或最小值。
            Optional<Student> maxDish = list1.stream().collect(Collectors.maxBy(Comparator.comparing(Student::getUnit)));
            Optional<Student> minDish = list1.stream().collect(Collectors.minBy(Comparator.comparing(Student::getUnit)));
            System.out.println("--07->" + maxDish);
            System.out.println("--08->" + minDish);
    
    
            //BigDecimal::add方法1:
            BigDecimal amounts = list1.stream()
                    .map(item -> item.price)
                    .reduce(BigDecimal.ZERO, BigDecimal::add);
            amounts = amounts.setScale(1, BigDecimal.ROUND_UP);
            System.out.println("--09->" + amounts);
    
            BigDecimal amounts21 = list1.stream()
                    .map(item -> item.price.multiply(BigDecimal.valueOf(item.unit)))
                    .reduce(BigDecimal.ZERO, BigDecimal::add);
            amounts21 = amounts21.setScale(1, BigDecimal.ROUND_UP);
            System.out.println("--091->" + amounts21);
    
            //BigDecimal::add方法2:
            BigDecimal sum2 = list1.stream()
                    .map(Student::getPrice)
                    .reduce(BigDecimal::add)
                    .get();
            sum2 = sum2.setScale(1, BigDecimal.ROUND_UP);
            System.out.println("--10->" + sum2);
            BigDecimal sum21 = list1.stream()
                    .map(item -> item.price.multiply(BigDecimal.valueOf(item.unit)))
                    .reduce(BigDecimal::add)
                    .get();
            sum21 = sum21.setScale(1, BigDecimal.ROUND_UP);
            System.out.println("--101->" + sum21);
    
    
            list1.stream().mapToDouble(Student::getUnit).sum();//
            list1.stream().mapToDouble(Student::getUnit).max();//最大
            list1.stream().mapToDouble(Student::getUnit).min();//最小
            list1.stream().mapToDouble(Student::getUnit).average();//平均值
    
            // intStream、LongStream 和 DoubleStream 等流的类中,有个非常有用的方法叫做 summaryStatistics() 。
            // 可以返回 IntSummaryStatistics、LongSummaryStatistics 或者 DoubleSummaryStatistic s,描述流中元素的各种摘要数据。
            //获取数字的个数、最小值、最大值、总和以及平均值  https://www.cnblogs.com/L-a-u-r-a/p/9077615.html
    //      IntSummaryStatistics summaryStatistics = list1.stream().mapToInt((x) -> x.getUnit()).summaryStatistics();
            IntSummaryStatistics summaryStatistics = list1.stream().collect(Collectors.summarizingInt(Student::getUnit));
            double average = summaryStatistics.getAverage();
            long count = summaryStatistics.getCount();
            int max = summaryStatistics.getMax();
            int min = summaryStatistics.getMin();
            long sum = summaryStatistics.getSum();
            System.out.println("count : " + count);
            System.out.println("max : " + max);
            System.out.println("min : " + min);
            System.out.println("Sum : " + sum);
            System.out.println("Average : " + average);
    
        }
    
        @Builder
        @Data
        @EqualsAndHashCode(callSuper = false)
        static class Student {
            int id;
            String name;
            Integer unit;
            BigDecimal price;
            double price2;
            String groupId;
        }
    }

      

    https://www.cnblogs.com/yangweiqiang/p/6934671.html

  • 相关阅读:
    提取PDF内容保存到Excel--Python3实现
    Python正则表达式常用语法
    我的数学建模之路
    Git基本用法
    PDF电子发票内容提取
    获取代理IP地址
    adb 命令 exec-out 直接截图保存到电脑出错的解决办法
    Python基础十一:使用模块
    MSTP生成树实验
    防火墙双机热备概念
  • 原文地址:https://www.cnblogs.com/hahajava/p/9204500.html
Copyright © 2011-2022 走看看