【Java 8】Stream通过reduce()方法合并流为一条数据示例


在本页中,我们将提供 Java 8 Stream reduce()示例。

Stream reduce()对流的元素执行缩减。它使用恒等式和累加器函数进行归约。

在并行处理中,我们可以将合并器函数作为附加参数传递给该方法。

Stream reduce()可用于获取存储在集合中的数字的总和。

Stream reduce()还可以用给定的分隔符连接存储在集合中的字符串数据。

Stream reduce()方法可以根据需要执行更多的还原任务

下面我们来看一些例子。

单参数方法

Stream.reduce()做累加操作

Stream.reduce()默认使用BinaryOperator作为累加器(Accumulator)。如果是数字,则起始值为0。如果是字符串,则起始值将为空字符串。

reduce(BinaryOperator accumulator)

方法将返回Optional实例。找到例子。

ReduceDemo1.java

package com.concretepage;
import java.util.Arrays;
public class ReduceDemo1 {
    public static void main(String[] args) {
    	  int[] array = {23,43,56,97,32};
    	  Arrays.stream(array).reduce((x,y) -> x+y).ifPresent(s -> System.out.println(s));
    	  Arrays.stream(array).reduce(Integer::sum).ifPresent(s -> System.out.println(s));
    	  Arrays.stream(array).reduce(StatisticsUtility::addIntData).ifPresent(s -> System.out.println(s));
    }
}  

StatisticsUtility.java

package com.concretepage;
public class StatisticsUtility {
	public static int addIntData(int num1, int num2) {
		return num1 + num2;
	}
} 

输出

251
251
251 

双参数方法

Stream.reduce()带初始值的累加操作

这里我们将使用一个恒等式和累加器。我们将传递标识作为起始值。

reduce(T identity, BinaryOperator<T> accumulator)

来看一组示例

ReduceDemo2.java

package com.concretepage;
import java.util.Arrays;
public class ReduceDemo2 {
    public static void main(String[] args) {
    	  int[] array = {23,43,56,97,32};
    	  //Set start value. Result will be start value + sum of array. 
    	  int startValue = 100;
    	  int sum = Arrays.stream(array).reduce(startValue, (x,y) -> x+y);
    	  System.out.println(sum);
    	  sum = Arrays.stream(array).reduce(startValue, Integer::sum);
    	  System.out.println(sum);
    	  sum = Arrays.stream(array).reduce(startValue, StatisticsUtility::addIntData);
    	  System.out.println(sum);
    }
}  

输出

351
351
351 

三参数方法

Stream.reduce()与标识(Identity),累加器(Accumulator), 组合器(Combiner)使用

这里我们将在reduce()方法中传递三个参数identity、accumulator和combiner。标识值必须是组合器函数的标识。这种三参数方法用于并行处理。合并器只与并行流一起工作,否则就没有要合并的内容。Accumulator先处理后,Combiner再执行。

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

ReduceDemo3.java

package com.concretepage;
import java.util.Arrays;
import java.util.List;
public class ReduceDemo3 {
    public static void main(String[] args) {
      List<Integer> list2 = Arrays.asList(5, 6, 7);
      int res = list2.parallelStream().reduce(1, (s1, s2) -> s1 * s2, (p, q) -> p * q);
      System.out.println(res);
    }
} 

输出

210 

更多例子

将列表和数组缩减为字符串

ReduceToString.java

package com.concretepage;
import java.util.Arrays;
import java.util.List;
public class ReduceToString {
	public static void main(String[] args) {
		//Reduce Array to String.
		String[] array = {"Mohan", "Sohan", "Mahesh"};
		Arrays.stream(array).reduce((x, y) -> x +"," + y)
		       .ifPresent(s -> System.out.println("Array to String: "+ s));
		//Reduce List to String.
		List<String> list = Arrays.asList("Mohan", "Sohan", "Mahesh");
		list.stream().reduce((x, y) -> x +"," + y)
			       .ifPresent(s -> System.out.println("List to String: "+ s));
	}
} 

输出

Array to String: Mohan,Sohan,Mahesh
List to String: Mohan,Sohan,Mahesh 

将列表和数组缩减求和

ReduceToSum.java

package com.concretepage;
import java.util.Arrays;
import java.util.List;
public class ReduceToSum {
	public static void main(String[] args) {
		//Reduce Array to sum.
		int[] array = {30, 10, 20, 40};
		int sum = Arrays.stream(array).reduce(0, (x, y) -> x + y);
		System.out.println("Sum of Array: "+ sum);
		//Reduce List to sum.
		List<Integer> list = Arrays.asList(30, 10, 20, 40);
		sum = list.stream().reduce(0, (x, y) -> x + y);
		System.out.println("Sum of List: "+ sum);
	}
} 

输出

Sum of Array: 100
Sum of List: 100 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM