返回顶部
首页 > 资讯 > 精选 >JAVA8 Stream流中的reduce()方法怎么使用
  • 491
分享到

JAVA8 Stream流中的reduce()方法怎么使用

2023-07-05 07:07:08 491人浏览 八月长安
摘要

这篇文章主要介绍“JAVA8 Stream流中的reduce()方法怎么使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“JAVA8 Stream流中的reduce()方法怎么使

这篇文章主要介绍“JAVA8 Stream流中的reduce()方法怎么使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“JAVA8 Stream流中的reduce()方法怎么使用”文章能帮助大家解决问题。

reduce()简介

  • Reduce 原意:减少,缩小

  • 根据指定的计算模型将Stream中的值计算得到一个最终结果

解释reduce 操作可以实现从Stream中生成一个值,其生成的值不是随意的,而是根据指定的计算模型。比如,之前提到count、min和max方法,因为常用而被纳入标准库中。事实上,这些方法都是reduce操作。

reduce三个override的方法

reduce方法有三个override的方法:

Optional<T> reduce(BinaryOperator<T> accumulator);
T reduce(T identity, BinaryOperator<T> accumulator);
<U> U reduce(U identity,                 BiFunction<U, ? super T, U> accumulator,                 BinaryOperator<U> combiner);

公共集合

测试代码中的所有集合,都是该集合。 

List<Person> javaProgrammers = new ArrayList<Person>() {        {            add(new Person("Elsdon", "Jaycob", "Java programmer", "male", 2000, 18));            add(new Person("Tamsen", "Brittany", "Java programmer", "female", 2371, 55));            add(new Person("Floyd", "Donny", "Java programmer", "male", 3322, 25));            add(new Person("Sindy", "Jonie", "Java programmer", "female", 35020, 15));            add(new Person("Vere", "Hervey", "Java programmer", "male", 2272, 25));            add(new Person("Maude", "Jaimie", "Java programmer", "female", 2057, 87));            add(new Person("Shawn", "Randall", "Java programmer", "male", 3120, 99));            add(new Person("Jayden", "Corrina", "Java programmer", "female", 345, 25));            add(new Person("Palmer", "Dene", "Java programmer", "male", 3375, 14));            add(new Person("Addison", "Pam", "Java programmer", "female", 3426, 20));        }    };

 方式一reduce(BinaryOperator accumulator)

Optional<T> reduce(BinaryOperator<T> accumulator);
我们先看第一个变形,参数列表为一个函数接口BinaryOperator<T>,
BinaryOperator源码

 public interface BinaryOperator<T> extends BiFunction<T,T,T> {      public static <T> BinaryOperator<T> minBy(Comparator<? super T> comparator) {        Objects.requireNonNull(comparator);        return (a, b) -> comparator.compare(a, b) <= 0 ? a : b;    }    public static <T> BinaryOperator<T> maxBy(Comparator<? super T> comparator) {        Objects.requireNonNull(comparator);        return (a, b) -> comparator.compare(a, b) >= 0 ? a : b;    }}

看BinaryOperator接口源码,我们可以看到,它又继承了BiFunction<T,T,T>.
另外,在BinaryOperator接口中又定义了另个静态方法为minBy和maxBy,
上面我们提到BinaryOperator接口继承了BiFunction<T,T,T>,我们看一下BiFunction<T,T,T>源码:

 @FunctionalInterfacepublic interface BiFunction<T, U, R> {    R apply(T t, U u);//接收两个参数 t 和 u, 返回 R}

Bifunction中有一个apply方法,接收两个参数,返回一个结果
小结: 不管是BinaryOperator类还是最终继承的BiFunction类,在类上都有@FunctionalInterface注解,因此reduce(BinaryOperator<T> accumulator)方法需要一个函数式接口参数,该函数式接口需要两个参数,返回一个结果(reduce中返回的结果会作为下次累加器计算的第一个参数),也就是累加器,最终得到一个Optional对象

测试示例代码:

     @Test    public void Test() {        int asInt = javaProgrammers.stream()                                    .mapToInt(Person::getSalary)//返回数值流,减少拆箱封箱操作,避免占用内存  IntStream                                    .reduce((x, y) -> x += y)// int                                    .getAsInt(); //return int        System.out.printf("方式一   reduce(BinaryOperator<T> accumulator)   求薪资测试结果:"+asInt);             }

方式二reduce(T identity, BinaryOperator accumulator) T reduce(T identity, BinaryOperator<T> accumulator);
与第一种变形相同的是都会接受一个BinaryOperator函数接口,不同的是其会接受一个identity参数,identity参数与Stream中数据同类型,相当于一个的初始值,通过累加器accumulator迭代计算Stream中的数据,得到一个跟Stream中数据相同类型的最终结果。
测试示例代码:

     @Test    public void test1(){        int reduce = javaProgrammers.stream().mapToInt(Person::getSalary).reduce(10000, (x, y) -> x += y);        System.out.printf("方式二  reduce(T identity, BinaryOperator<T> accumulator)   求薪资测试结果:"+reduce);             }

打印结果:

 方式一   reduce(BinaryOperator<T> accumulator)   求薪资测试结果:57308
方式二  reduce(T identity, BinaryOperator<T> accumulator) 求薪资测试结果:67308 //初始值10000

方式三 reduce(U identity,BiFunction<U, ? super T, U> accumulator,BinaryOperator<U> combiner)

\<U\> U reduce(U identity,BiFunction\<U, ? super T, U\> accumulator,BinaryOperator\<U\> combiner);
我们先观察分析再次被改变的参数列表:

               1. 第一个参数:返回实例u,传递你要返回的U类型对象的初始化实例u

               2. 第二个参数:累加器accumulator,可以使用lambda表达式,声明你在u上累加你的数据来源t的逻辑,例如(u,t)->u.sum(t),此时lambda表达式的行参列表是返回实例u和遍历的集合元素t,函数体是在u上累加t

               3. 第三个参数:参数组合器combiner,接受lambda表达式。

根据参数我们一步一步分析代码示例:

@Test    public void test2() {        ArrayList<Integer> accResult_ = Stream.of(1, 2, 3, 4)                //第一个参数,初始值为ArrayList                .reduce(new ArrayList<Integer>(),                        //第二个参数,实现了BiFunction函数式接口中apply方法,并且打印BiFunction                        new BiFunction<ArrayList<Integer>, Integer, ArrayList<Integer>>() {                            @Override                            public ArrayList<Integer> apply(ArrayList<Integer> acc, Integer item) {                                 acc.add(item);                                System.out.println("item: " + item);                                System.out.println("acc+ : " + acc);                                System.out.println("BiFunction");                                return acc;                            }                            //第三个参数---参数的数据类型必须为返回数据类型,改参数主要用于合并多个线程的result值                            // (Stream是支持并发操作的,为了避免竞争,对于reduce线程都会有独立的result)                        }, new BinaryOperator<ArrayList<Integer>>() {                            @Override                            public ArrayList<Integer> apply(ArrayList<Integer> acc, ArrayList<Integer> item) {                                System.out.println("BinaryOperator");                                acc.addAll(item);                                System.out.println("item: " + item);                                System.out.println("acc+ : " + acc);                                System.out.println("--------");                                return acc;                            }                        });        System.out.println("accResult_: " + accResult_);         System.out.println("------------------lambda优化代码-----------------");         ArrayList<Integer> newList = new ArrayList<>();         ArrayList<Integer> accResult_s = Stream.of(1,2,3,4)                .reduce(newList,                        (acc, item) -> {                            acc.add(item);                            System.out.println("item: " + item);                            System.out.println("acc+ : " + acc);                            System.out.println("BiFunction");                            return acc;                        }, (acc, item) -> null);        System.out.println("accResult_s: " + accResult_s);    }

         示例代码中,第一个参数是ArrayList,在第二个函数参数中打印了“BiFunction”,而在第三个参数接口中打印了函数接口中打印了”BinaryOperator“.看下面的打印结果,只打印了“BiFunction”,而没有打印”BinaryOperator“,也就是说第三个函数参数并没有执行。分析参数时我们知道了该变形可以返回任意类型的数据
        对于第三个函数参数,为什么没有执行,而且其参数必须为返回的数据类型?这是因为Stream是支持并发操作的,为了避免竞争,对于reduce线程都会有独立的result,combiner的作用在于合并每个线程的result得到最终结果。这也说明了了第三个函数参数的数据类型必须为返回数据类型了。

打印结果:

item: 1
acc+ : [1]
BiFunction
item: 2
acc+ : [1, 2]
BiFunction
item: 3
acc+ : [1, 2, 3]
BiFunction
item: 4
acc+ : [1, 2, 3, 4]
BiFunction

另外需要注意:因为第三个参数用来处理并发操作,如何处理数据的重复性,应多做考虑,否则会出现重复数据!

关于“JAVA8 Stream流中的reduce()方法怎么使用”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注编程网精选频道,小编每天都会为大家更新不同的知识点。

--结束END--

本文标题: JAVA8 Stream流中的reduce()方法怎么使用

本文链接: https://lsjlt.com/news/350261.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • JAVA8 Stream流中的reduce()方法怎么使用
    这篇文章主要介绍“JAVA8 Stream流中的reduce()方法怎么使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“JAVA8 Stream流中的reduce()方法怎么使...
    99+
    2023-07-05
  • JAVA8 Stream流中的reduce()方法详解
    目录reduce()简介reduce三个override的方法公共集合reduce()简介 Reduce 原意:减少,缩小根据指定的计算模型将Stream中的值计算得到一个...
    99+
    2023-02-28
    JAVA8 Stream reduce()方法 JAVA8 Stream reduce
  • Java8 Stream流常用方法是什么
    这篇文章主要介绍了Java8 Stream流常用方法是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Java8 Stream流常用方法是什么文章都会有所收获,下面我们一起来看看吧。一、概...
    99+
    2023-06-30
  • Java8 Stream流的常用方法汇总
    目录1、快速创建List(1)、new一个list,一个一个添加(2)、Stream流:创建动态list,可以添加元素(3)、如果创建一个固定长度的list,可以使用Arrays.a...
    99+
    2024-04-02
  • Java8 Stream 流常用方法合集
    目录一、概述二、分类三、具体用法1. 流的常用创建方法2. 流的中间操作3. 流的终止操作一、概述 Stream 是 Java8 中处理集合的关键抽象概念,它可以指定你希望对集合进行...
    99+
    2024-04-02
  • Java8新特性Stream流怎么使用
    本文小编为大家详细介绍“Java8新特性Stream流怎么使用”,内容详细,步骤清晰,细节处理妥当,希望这篇“Java8新特性Stream流怎么使用”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。Stream流的概...
    99+
    2023-07-02
  • Java8 Stream流式编程怎么使用
    这篇文章主要介绍了Java8 Stream流式编程怎么使用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Java8 Stream流式编程怎么使用文章都会有所收获,下面我们一起来看看吧。一、S...
    99+
    2023-07-05
  • Java8中Stream怎么使用
    今天小编给大家分享一下Java8中Stream怎么使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。一、概述Java 8 是...
    99+
    2023-07-02
  • Java8 Stream流的常用方法有哪些
    这篇文章主要介绍“Java8 Stream流的常用方法有哪些”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Java8 Stream流的常用方法有哪些”文章能帮助大家解决问题。1、...
    99+
    2023-07-02
  • Java8中Stream的使用方式
    目录前言:1. 为什么有经验的老手更倾向于使用Stream2. Stream 的使用方式3. Stream 的创建4. Stream 中间操作5. Stream 终止操作6. Str...
    99+
    2024-04-02
  • 【Stream流】java中Stream流详细使用方法
    在Java中,Stream是一种用于处理集合数据的流式操作API。它提供了一种简洁、灵活、高效的方式来对集合进行各种操作,如过滤、映射、排序等。下面是一些Stream的常用功能和详细的代码示例: 创...
    99+
    2023-09-29
    java spring boot 后端 开发语言
  • Java8中Stream的详细使用方法大全
    目录一、概述1、使用流的好处2、流是什么二、分类三、Stream的创建1、通过 java.util.Collection.stream() 方法用集合创建流2、使用 java.uti...
    99+
    2024-04-02
  • Java8中Stream的使用方式是什么
    这篇文章主要介绍“Java8中Stream的使用方式是什么”,在日常操作中,相信很多人在Java8中Stream的使用方式是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java8中Stream的使用方式...
    99+
    2023-06-30
  • 使用Java8 Stream流的skip + limit实现批处理的方法
    为什么需要 Stream Stream 作为 Java 8 的一大亮点,它与 java.io 包里的 InputStream 和 OutputStream 是完全不同的概念。它也不同...
    99+
    2024-04-02
  • Java8实现Stream流的合并的方法展示
    目录Stream.concatflatMap最近的需求里有这样一个场景,要校验一个集合中每个对象的多个Id的有效性。比如一个Customer对象,有3个Id:id1,id2,id3,...
    99+
    2023-05-19
    Java8的Stream流详解 java8 Stream流操作 Java8 Stream
  • Java8中Stream的常用方法有哪些
    本文小编为大家详细介绍“Java8中Stream的常用方法有哪些”,内容详细,步骤清晰,细节处理妥当,希望这篇“Java8中Stream的常用方法有哪些”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。 简...
    99+
    2023-06-16
  • javascript中怎么使用reduce方法
    这篇文章主要为大家展示了“javascript中怎么使用reduce方法”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“javascript中怎么使用reduce方法”这篇文章吧。在javascr...
    99+
    2023-06-15
  • Node.js中流(stream)的使用方法示例
    前言 本文主要给大家介绍了关于Node.js 流(stream)的使用方法,分享出来供大家参考学习,下面话不多说,来一起看看详细的介绍: 流是基于事件的API,用于管理和处理数据,而且有不错的效率.借助事件...
    99+
    2022-06-04
    中流 示例 使用方法
  • Java8中stream和functional interface怎么用
    这篇文章主要为大家展示了“Java8中stream和functional interface怎么用”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Java8中stream和functional i...
    99+
    2023-05-30
    java8 stream functional
  • Stream流中的Map方法
    在Java 8及以上的版本中,Stream中的map方法可以用于对Stream中的每个元素应用一个函数,并将结果存储在一个新的Stream中。具体用法如下: // 创建一个Stream对象Stream stream = ...;// 应用函...
    99+
    2023-08-31
    java 开发语言
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作