【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