• Java 8 Stream.reduce() 使用示例


    原文地址:https://mkyong.com/java8/java-8-stream-reduce-examples/

    作者:mkyong

    翻译:高行行

    在 Java 8 中,Stream.reduce()合并流的元素并产生单个值。

    使用 for 循环的简单求和运算。

      int[] numbers = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
      int sum = 0;
      for (int i : numbers) {
          sum += i;
      }
    
      System.out.println("sum : " + sum); // 55
    

    相当于 Stream.reduce()

      int[] numbers = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
    
      // 1st argument, init value = 0
      int sum = Arrays.stream(numbers).reduce(0, (a, b) -> a + b);
    
      System.out.println("sum : " + sum); // 55
    

    或方法引用 Integer::sum

    int sum = Arrays.stream(numbers).reduce(0, Integer::sum); // 55
    

    Integer.java

        /**
         * Adds two integers together as per the + operator.
         *
         * @param a the first operand
         * @param b the second operand
         * @return the sum of {@code a} and {@code b}
         * @see java.util.function.BinaryOperator
         * @since 1.8
         */
        public static int sum(int a, int b) {
            return a + b;
        }
    

    1. 方法签名

    1.1 查看Stream.reduce()方法签名:

    Stream.java

    T reduce(T identity, BinaryOperator<T> accumulator);
    

    IntStream.java

    int reduce(int identity, IntBinaryOperator op);
    

    LongStream.java

    long reduce(int identity, LongBinaryOperator op);
    
    • identity = 默认值或初始值。
    • BinaryOperator = 函数式接口,取两个值并产生一个新值。(注: java Function 函数中的 BinaryOperator 接口用于执行 lambda 表达式并返回一个 T 类型的返回值)

    1.2 如果缺少identity参数,则没有默认值或初始值,并且它返回 optional。

    Stream.java

    Optional<T> reduce(BinaryOperator<T> accumulator);
    

    2. 更多例子

    2.1 数学运算。

    int[] numbers = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
    
    int sum = Arrays.stream(numbers).reduce(0, (a, b) -> a + b);    // 55
    int sum2 = Arrays.stream(numbers).reduce(0, Integer::sum);      // 55
    
    int sum3 = Arrays.stream(numbers).reduce(0, (a, b) -> a - b);   // -55
    int sum4 = Arrays.stream(numbers).reduce(0, (a, b) -> a * b);   // 0, initial is 0, 0 * whatever = 0
    int sum5 = Arrays.stream(numbers).reduce(0, (a, b) -> a / b);   // 0
    

    2.2 最大和最小

    int[] numbers = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
    
    int max = Arrays.stream(numbers).reduce(0, (a, b) -> a > b ? a : b);  // 10
    int max1 = Arrays.stream(numbers).reduce(0, Integer::max);            // 10
    
    int min = Arrays.stream(numbers).reduce(0, (a, b) -> a < b ? a : b);  // 0
    int min1 = Arrays.stream(numbers).reduce(0, Integer::min);            // 0
    

    2.3 连接字符串。

      String[] strings = {"a", "b", "c", "d", "e"};
    
      // |a|b|c|d|e , the initial | join is not what we want
      String reduce = Arrays.stream(strings).reduce("", (a, b) -> a + "|" + b);
    
      // a|b|c|d|e, filter the initial "" empty string
      String reduce2 = Arrays.stream(strings).reduce("", (a, b) -> {
          if (!"".equals(a)) {
              return a + "|" + b;
          } else {
              return b;
          }
      });
    
      // a|b|c|d|e , better uses the Java 8 String.join :)  (最好使用 Java 8 的 String.join)
      String join = String.join("|", strings);
    

    3. Map & Reduce

    一个简单的 map 和 reduce 示例,用于从发票 List 中求 BigDecimal 的和。

    JavaReduce.java

    package com.mkyong;
    
    import java.math.BigDecimal;
    import java.math.RoundingMode;
    import java.util.Arrays;
    import java.util.List;
    
    public class JavaReduce {
    
        public static void main(String[] args) {
    
            // 发票集合
            List<Invoice> invoices = Arrays.asList(
                    new Invoice("A01", BigDecimal.valueOf(9.99), BigDecimal.valueOf(1)),
                    new Invoice("A02", BigDecimal.valueOf(19.99), BigDecimal.valueOf(1.5)),
                    new Invoice("A03", BigDecimal.valueOf(4.99), BigDecimal.valueOf(2))
            );
    
            BigDecimal sum = invoices.stream()
                    .map(x -> x.getQty().multiply(x.getPrice()))    // map,对集合中的元素进行操作
                    .reduce(BigDecimal.ZERO, BigDecimal::add);      // reduce,将上一步得到的结果进行合并得到最终的结果
    
            System.out.println(sum);    // 49.955
            System.out.println(sum.setScale(2, RoundingMode.HALF_UP));  // 49.96 使用setScale方法进行四舍五入
    
        }
    
    }
    
    class Invoice {
    
        // 发票号码
        String invoiceNo;
        // 价格
        BigDecimal price;
        // 数量
        BigDecimal qty;
    
        // getters, stters n constructor
    }
    

    输出

    49.955
    49.96
    

    个人公众号《骇客与画家》,欢迎关注

  • 相关阅读:
    【转+补充】在OpenCV for Android 2.4.5中使用SURF(nonfree module)
    Delphi StarOffice Framework Beta 1.0 发布
    Angular ngIf相关问题
    angularjs文档下载
    公众号微信支付开发
    公众号第三方平台开发 教程六 代公众号使用JS SDK说明
    公众号第三方平台开发 教程五 代公众号处理消息和事件
    公众号第三方平台开发 教程四 代公众号发起网页授权说明
    公众号第三方平台开发 教程三 微信公众号授权第三方平台
    公众号第三方平台开发 教程二 component_verify_ticket和accessToken的获取
  • 原文地址:https://www.cnblogs.com/gaohanghang/p/12390233.html
Copyright © 2020-2023  润新知