在本頁中,我們將提供 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