Java8 Stream 中的 reduce() 方法,执行聚合操作

初识 Stream 中的 reduce() 方法,是在最近一次刷算法题的过程中(下面会讲到),简洁干练的写法,让我眼前一亮。

所以,我简单学习了,总结了一下写法:


正文

Java 8 API添加了一个新的抽象称为流Stream,可以让你以一种声明的方式处理数据。

Stream API可以极大提高Java程序员的生产力,让程序员写出高效率、干净、简洁的代码。

这种风格将要处理的元素集合看作一种流, 流在管道中传输, 并且可以在管道的节点上进行处理, 比如筛选, 排序,聚合等。

reduce()使用:

先看一下reduce() 方法内部,参数 BinaryOperator<T> 接口继承了 BiFunction 接口:

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

简单来说,BinaryOperator 函数式接口类似于 Lambda 表达式(->),接收两个参数,产生一个结果,只是它的三个参数都是同一个数据类型。

@Data
public class User {
    private String username;
    private String gender;
    private Integer age;
    public User(){}

    public User(String username, String gender, Integer age) {
        this.username = username;
        this.gender= gender;
        this.age = age;
    }

    public static void main(final String... args) {
        ArrayList<User> list = new ArrayList<>();

        list.add(new User("jimmy", "1", 30));
        list.add(new User("amy", "2", 20));
        list.add(new User("simmy", "1", 10));

        // reduce 需要传入一个BinaryOperator接口,继承了BiFunction接口
        // 简单说  就是需要传入2个同类型参数,返回同类型的参数
        // 预定义一下减法函数式
        BinaryOperator<Integer> add = (n1, n2) -> n1+n2;
        BinaryOperator<Integer> minus = (n1, n2) -> n1-n2;
        list.stream().map(n->n.getAge()).reduce(add).ifPresent(n-> System.out.println(n));     // 加法
        list.stream().map(n->n.getAge()).reduce(minus).ifPresent(n-> System.out.println(n));     // 减法

        // 未预定义,直接写函数式
        list.stream().map(n->n.getAge()).reduce((a,b)->a*b).ifPresent(n-> System.out.println(n));     // 乘法
    }
}
// 输出结果:
60
0
6000

算法题

下面是我使用reduce聚合函数的一个场景,大家参考一下:

题目:《剑指offer》- 找出只出现一次的数字
题目描述:给定一个非空整数数组,除了某【一个】元素只出现一次以外,其余每个元素均出现两次,找出那个只出现了一次的元素。
思路:两个相同的数异或后为 0,一个数和 0 异或还是它本身,将所有数异或后即得到 A、B 异或的结果,然后求得 1 在该数最右边出现的 index,然后判断每个数右移 index 后是不是 1。
    int[] nums = {1,2,3,4,5,6,7,8,9}

    // 1.for循环写法
    public int singleNumber_1(int[] nums) {
        int num = nums[0];
        for (int i = 1; i < nums.length; i++) {
            num ^= nums[i];
        }
        return num;
    }

    // 2.stream 写法
    public int singleNumber_2(int[] nums) {
        return Arrays.stream(nums).reduce((a, b) -> a^b).getAsInt();
    }

看看,stream 的 reduce 聚合函数写法是不是箱单简洁干练?用起来吧!


猜你喜欢

转载自blog.csdn.net/weixin_44259720/article/details/122603240