我是靠谱客的博主 开心荔枝,最近开发中收集的这篇文章主要介绍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 聚合函数写法是不是箱单简洁干练?用起来吧!


最后

以上就是开心荔枝为你收集整理的Java8 Stream 中的 reduce() 方法,执行聚合操作正文的全部内容,希望文章能够帮你解决Java8 Stream 中的 reduce() 方法,执行聚合操作正文所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(43)

评论列表共有 0 条评论

立即
投稿
返回
顶部