`

java8 Stream reduce方法的使用

 
阅读更多

今天下了JDK 8 EA 尝尝鲜  

摸了好久才摸懂 一些地方 写写文章分享下经验 如有说错欢迎打脸

 

reduce的操作有点麻烦 所以这里就专门说一下

如有说错欢迎打脸...

 

因为java是静态语言所以一些地方自然不如动态语言方便 

比如说我这里有个要求 把0-99的List打印成String输出(当然直接用for也可以啦)

用groovy的话 代码很简单:

def list=0..<100
def sb=list.inject(new StringBuffer(),{result,element -> result.append("${element} ")})

 最后也会用java中 stream的reduce说一遍

 

开始...

 

而java中的reduce操作有三个:

  • 一个参数的
  • 两个参数的
  • 三个参数的_(:3」∠)_



 

 

一个简单是实例 完成累加的操作(当然用mapToInt然后再用sum更好,这里说明用):

 public static void main(String[] args){
   List<Integer> list=new ArrayList<Integer>(); 
   for(int i=0;i<100;i++){
     list.add(Integer.valueOf(i));
   }
   
   System.out.println(list.stream().reduce(
   (result,element)->
        result=result+element));
   
   System.out.println(list.stream().reduce(
   0,
   (result,element)->
        result=result+element));
   

   System.out.println(list.stream().reduce(
   0,
   (result,element)->
        result=result+element
		,(u,t) -> t)); 
   
 }

 结果:



 

在实现中

一个参数是这样实现(近似的实现)的:

     boolean foundAny = false;
     T result = null;
     for (T element : this stream) {
         if (!foundAny) {
             foundAny = true;
             result = element;
         }
         else
             result = accumulator.apply(result, element);
     }
     return foundAny ? Optional.of(result) : Optional.empty();

 实现很简单 初始的result是stream中的某一个值(实际中不是顺序执行的) 之后执行你给的函数就可以了(请把accumulator.apply(result,element) 用自己的函数代替 这里是 result=result+element;

从这里也提醒了函数中参数的位置 聚合用的result是第一个参数 遍历的元素放在第二个参数里

 

二个参数的也同理:

     T result = identity;
     for (T element : this stream)
         result = accumulator.apply(result, element)
     return result;

 因为result用的是自定义的值(要符合泛型的要求) 所以代码短一些

 

三个参数的 对初始值没有泛型的要求:

 

     U result = identity;
     for (T element : this stream)
         result = accumulator.apply(result, element)
     return result;

 看起来和第二个除了在泛型的要求上不一样之外 也没其他什么 但他有个要求

对于第二个函数有限制:

必须满足

  combiner.apply(u, accumulator.apply(identity, t)) == accumulator.apply(u, t)

 但实际使用的时候感觉怪怪的...因为即使有打印信息 并不会有任何输出 但如果这个函数没有返回任何东西无法通过编译.. 实际中直接返回u或者t就可以了(这里有人知道为什么吗..求解),但为了符合以上这个规定,两个函数写得一样好像也没关系.

 

 

只有第三个参数的reduce是不受流的类型限制的 也就是可以返回任意类型的数据 所以三个参数的那个实用性大一点(应该...)

 

现在回到刚开始的问题里

给出代码:

 

import java.util.*;
import java.util.concurrent.*;
import java.util.stream.*;

public class Test4{
 public static void main(String[] args){
   List<Integer> list=new ArrayList<Integer>(); 
   for(int i=0;i<100;i++){
     list.add(Integer.valueOf(i));
   }

   System.out.println(list.stream().reduce(
   new StringBuilder(),
   (result,element)->
        result=result.append(element)
		,(u,t) -> u=u.append(t))); //这个地方 返回 u或者t也是可以的 运行没错
   
 }
}

 

 

 

 

  • 大小: 3.9 KB
  • 大小: 24.3 KB
3
2
分享到:
评论
4 楼 fair_jm 2014-04-05  
crazy.j 写道
fair_jm 写道
crazy.j 写道
将stream转换为parallel模式时候reduce的combiner也就是你所谓没有输出的函数就会执行了,这个函数具体作用是什么,我正在看,感觉是将两个集合合并用的。

嗯...哎 我觉得java这些reduce操作 写起来相比其他语言要丑一点..这个我也还没弄懂..以后用到再看看了

看完了,在单步跟踪代码时候发现,当stream以parallel模式运行时候,stream被拆分为了n个小段分配到了不同的Thread上运行,这里JDK用了Frok/Join框架,combiner函数的作用是将两个不同线程执行结果合并。

thx~~~ 一直没跟进去看 真是辛苦你了^_^
3 楼 crazy.j 2014-04-05  
fair_jm 写道
crazy.j 写道
将stream转换为parallel模式时候reduce的combiner也就是你所谓没有输出的函数就会执行了,这个函数具体作用是什么,我正在看,感觉是将两个集合合并用的。

嗯...哎 我觉得java这些reduce操作 写起来相比其他语言要丑一点..这个我也还没弄懂..以后用到再看看了

看完了,在单步跟踪代码时候发现,当stream以parallel模式运行时候,stream被拆分为了n个小段分配到了不同的Thread上运行,这里JDK用了Frok/Join框架,combiner函数的作用是将两个不同线程执行结果合并。
2 楼 fair_jm 2014-04-05  
crazy.j 写道
将stream转换为parallel模式时候reduce的combiner也就是你所谓没有输出的函数就会执行了,这个函数具体作用是什么,我正在看,感觉是将两个集合合并用的。

嗯...哎 我觉得java这些reduce操作 写起来相比其他语言要丑一点..这个我也还没弄懂..以后用到再看看了
1 楼 crazy.j 2014-04-05  
将stream转换为parallel模式时候reduce的combiner也就是你所谓没有输出的函数就会执行了,这个函数具体作用是什么,我正在看,感觉是将两个集合合并用的。

相关推荐

    Java 8系列之Stream中万能的reduce用法说明

    在 Java 8 中,Stream API 提供了一个强大的方法reduce,用于从 Stream 中生成一个值。这个值不是随意的,而是根据指定的计算模型。reduce 操作可以实现从 Stream 中生成一个值,其生成的值不是随意的,而是根据指定...

    JAVA8 stream中三个参数的reduce方法对List进行分组统计操作

    通过这种方式,Java 8的Stream API和`reduce()`方法提供了一种简洁、高效的方法来处理分组统计任务,类似于JavaScript中的`_.groupBy`和`_.reduce`。这种编程风格有助于我们编写出更清晰、更易于维护的代码。

    Java8 Stream学习

    ### Java8 Stream学习 ...综上所述,Java8的Stream API为处理集合数据提供了一种强大而优雅的方法,极大地提高了开发效率和代码质量。通过掌握Stream的使用技巧,开发者可以在实际项目中更好地应对各种数据处理需求。

    Stream_Java8.pdf

    根据提供的文件信息,本文将详细介绍Java 8中Stream API的核心概念、使用方法及其实战案例。Stream API作为Java 8的重要特性之一,极大地简化了集合处理的代码编写过程,提升了程序的可读性和效率。 ### Stream概述...

    java8Stream方法简介-源码.rar

    在Java 8 Stream API中,我们可以实现一些复杂的操作,比如使用`filter()`筛选出满足条件的元素,`map()`将元素转换为另一种类型,然后使用`reduce()`进行聚合操作。此外,`groupingBy()`方法可以用于按指定字段进行...

    java8 stream使用总结

    以下是对"Java 8 Stream使用总结"的详细说明: 1. **什么是Stream**: Stream API是一个在Java 8中引入的概念,它提供了一种全新的处理数据的方式,可以看作是从集合到计算的一种桥梁。Stream不是存储数据的数据...

    Java-Stream流详解.pptx.pptx

    Java Stream是Java 8引入的重要特性,它提供了一种声明式处理数据集合的方式,极大地提升了代码的可读性和性能。Stream允许程序员更加专注于业务逻辑,而不是底层数据处理的细节。 **1. Java Stream简介** Java ...

    java8 利用reduce实现将列表中的多个元素的属性求和并返回操作

    此外,在 Java8 中,我们还可以使用 Stream 的其他方法来实现列表元素的属性求和操作,例如使用 map 方法来将列表中的元素转换成一个新的流,然后使用 reduce 方法来求和。 例如,我们可以使用以下代码来实现上述...

    Java8 Stream API 详细使用方法与操作技巧指南

    Java8 Stream API 详细使用方法与操作技巧指南 Java 8 引入了 Stream API,这是一个重要的特性,允许开发者以一种声明式的方式对数据进行处理。Stream 翻译过来是“流”,它可以看做是一个可操作的数据集序列,具有...

    06.第六节-使用stream的Reduce求和.mp4

    Stream 是 Java8 中处理集合的关键抽象概念,它可以指定你希望对集合进行的操作,可以执行非常复杂的查找、过滤和映射数据等操作。使用Stream API 对集合数据进行操作,就类似于使用 SQL 执行的数据库查询。也可以...

    Java Stream全面讲解

    Stream API首次在Java 8中引入,极大地提升了代码的简洁性和可读性。 Java中的Stream分为两种类型:InputStream和OutputStream,分别对应输入流和输出流。InputStream用于读取数据,而OutputStream则用于写入数据。...

    Java 8 之 流(Stream)

    在`java8-stream.xls`文件中,我们可以使用Java 8的流API来处理Excel数据。例如,读取工作表中的数据,使用流进行过滤、排序等操作,然后将结果写入新的工作表。 ```java // 使用Apache POI库读取Excel文件 ...

    java8-Stream API终端操作.pdf

    Java 8 Stream API 终端操作 Java 8 中的 Stream API 提供了强大的数据处理功能,其中的终端操作是指将 Stream 处理结果转换为实际的数据结构。Java Stream 管道流数据处理操作可以分为三个阶段:第一阶段是将集合...

    Speedment一个数据库访问库它利用了Java8StreamAPI进行查询

    例如,你可以使用filter、map、reduce等方法构建复杂的查询,而无需编写SQL语句。这种面向对象的查询方式使得代码更易于理解和维护。 4. **并行处理**:由于Stream API支持并行处理,Speedment能够充分利用多核...

    JAVA 8 Stream 2.rar

    Java 8 Stream API是Java开发中的一个重要里程碑,它引入了一种全新的处理数据的方式,使得代码更加简洁、高效。Stream API可以用于处理集合、数组以及其他数据源,提供了丰富的操作,如筛选、映射、聚合等,使得...

    Java8特性Stream流的使用(学完就会,项目源码,附带个人总结)

    以下将详细介绍Stream流的使用,以及它在Java8中的重要性。 首先,Stream API是一种用于处理集合的新接口,它可以对集合进行各种操作,如过滤、映射、聚合等,而无需显式地遍历集合。这种处理方式称为“函数式编程...

    实用的 Java 8 Stream 代码

    Java 8 是一个重要的 Java 发行版本,引入了许多新特性,其中最为显著的就是 Stream API。Stream API 提供了一种全新的处理数据的方式,使得在集合、数组等数据源上的操作更加简洁、高效。在这个主题中,我们将深入...

    Java8Test.java_java8_almosttog_stream流_

    - 根据文件名`Java8Test.java`,我们可以推测该文件包含一个测试类,可能测试了Stream API的使用,比如测试了`filter()`、`map()`、`reduce()`等方法。 - 测试可能包括对数组或集合进行流操作,例如筛选满足特定...

    详解Java8 Collect收集Stream的方法

    Java8 Collect收集Stream的方法详解 Java8 中的 Collect 收集 Stream 的方法是 Java8 中一个重要的功能,主要用于对 Stream 中的元素进行收集和处理。下面是对该方法的详细介绍。 title: 详解 Java8 Collect收集...

    java1.8新特性stream.rar

    其中,Stream API是Java 8中最显著的新特性之一,它为处理集合数据提供了全新的方式。Stream API使得我们能够以声明式的方式处理数据,非常适合进行并行计算和大数据操作。下面将详细介绍Stream API的基本使用及其在...

Global site tag (gtag.js) - Google Analytics