reduce()
和
collect()
方法提供
Java8
Array
,
Map
和
List
集合值的总和示例。
在Java8
中,有多种计算值总和的方法。我们可以利用IntStream.sum()
从汇总统计中得到总数。
我们也可以创建自己的方法来求和。
我们将在这里讨论计算总和的不同方法。
IntStream.sum()
求和对于integer
数据类型,我们可以用IntStream.sum()
求和。
int sum = map.values().stream().mapToInt(i->i).sum();
int sum = list.stream().map(Line::getLength).mapToInt(Integer::intValue).sum();
在Java8
中,对于long
数据类型,有LongStream
;对于double
数据类型,有DoubleStream
。
Stream.collect()
中使用Collectors.summingInt()
求和我们可以在Stream.collect()
中使用Collectors.summingInt()
对integer
数据类型获取总数
int sum = list.stream().map(Line::getLength).collect(Collectors.summingInt(i->i));
在Java8
中,对于long
数据类型,有summingLong
;对于double
数据类型,有summingDouble
。
Stream.collect()
和IntSummaryStatistics
中使用Collectors.summarizingInt()
求和在Stream.collect()
和IntSummaryStatistics
中使用Collectors.summarizingInt()
获得总数
IntSummaryStatistics stats = list.stream()
.collect(Collectors.summarizingInt(Line::getLength));
IntSummaryStatistics stats = list.stream().flatMap(a->Arrays.stream(a))
.collect(Collectors.summarizingInt(i->i));
System.out.println(stats.getSum());
在Java8
中,对于long
数据类型,我们在LongSummaryStatistics
使用summingLong
;对于double
数据类型,我们在DoubleSummaryStatistics
使用summingDouble
。
Line
是我们自定义的类
Line.java
package com.concretepage;
public class Line {
private int length;
public Line(int length) {
this.length = length;
}
public int getLength() {
return length;
}
}
BiFunction
和BinaryOperator
使用Stream.reduce()
求和我们可以用Stream.reduce()
在并行处理中,BiFunction
作为累加器(accumulator
),BinaryOperator
作为组合器(combiner
)。
int sum = list.parallelStream().reduce(0, (output, ob) -> output + ob.getLength(), (a, b) -> a + b);
这里0是一个标识(identity
)。对流的每个元素使用BinaryOperator
来操作标识。如果标识(identity
)为0,那么在我们的示例中,它将获得stream元素的和。
Stream.reduce()
求和要执行加法,我们还可以使用自定义方法Stream.reduce()
如下。
int sum = Arrays.stream(array).reduce(0, StatisticsUtility::addIntData);
这里StatisticsUtility
是我们的自定义类
StatisticsUtility.java
package com.concretepage;
public class StatisticsUtility {
public static int addIntData(int num1, int num2) {
return num1 + num2;
}
}
我们也可以使用内置类进行求和。
int sum = Arrays.stream(array).reduce(0, Integer::sum);
Array
获取总数的示例SumOfArrayDemo.java
package com.concretepage;
import java.util.Arrays;
import java.util.function.IntBinaryOperator;
public class SumOfArrayDemo {
public static void main(String[] args) {
int[] array = {
23,43,56,97,32};
System.out.println("--Using IntStream.sum()--");
int sum = Arrays.stream(array).sum();
System.out.println(sum);
System.out.println("--Using Stream.reduce() with IntBinaryOperator--");
IntBinaryOperator ibop = (x,y) -> x+y;
sum = Arrays.stream(array).reduce(0, ibop);
System.out.println(sum);
System.out.println("--Using Stream.reduce() with Integer.sum()--");
sum = Arrays.stream(array).reduce(0, Integer::sum);
System.out.println(sum);
System.out.println("--Using custom method--");
sum = Arrays.stream(array).reduce(0, StatisticsUtility::addIntData);
System.out.println(sum);
}
}
输出
--Using IntStream.sum()--
251
--Using Stream.reduce() with IntBinaryOperator--
251
--Using Stream.reduce() with Integer.sum()--
251
--Using custom method--
251
List
获取总数的示例SumOfListDemo.java
package com.concretepage;
import java.util.ArrayList;
import java.util.IntSummaryStatistics;
import java.util.List;
import java.util.stream.Collectors;
public class SumOfListDemo {
public static void main(String[] args) {
List<Line> list = new ArrayList<>();
list.add(new Line(213));
list.add(new Line(233));
list.add(new Line(243));
list.add(new Line(253));
System.out.println("--Using IntStream.sum()--");
int sum = list.stream().map(Line::getLength).mapToInt(Integer::intValue).sum();
System.out.println(sum);
System.out.println("--Using Collectors.summingInt()--");
sum = list.stream().map(Line::getLength).collect(Collectors.summingInt(i->i));
System.out.println(sum);
System.out.println("--Using summarizingInt()--");
IntSummaryStatistics stats = list.stream()
.collect(Collectors.summarizingInt(Line::getLength));
System.out.println(stats.getSum());
System.out.println("--Using Stream.reduce() with combiner--");
sum = list.parallelStream().reduce(0, (output, ob) -> output + ob.getLength(), (a, b) -> a + b);
System.out.println(sum);
}
}
输出
--Using IntStream.sum()--
942
--Using Collectors.summingInt()--
942
--Using summarizingInt()--
942
--Using Stream.reduce() with combiner--
942
List
中嵌套Array
获取总数的示例SumOfListOfArrayDemo.java
package com.concretepage;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.IntSummaryStatistics;
import java.util.List;
import java.util.stream.Collectors;
public class SumOfListOfArrayDemo {
public static void main(String[] args) {
List<Integer[]> list = new ArrayList<>();
Integer[] a1 = {
6,3,8,12};
list.add(a1);
Integer[] a2 = {
8,13,9,22};
list.add(a2);
System.out.println("--Using Collectors.summingInt()--");
int sum = list.stream().flatMap(a->Arrays.stream(a)).
collect(Collectors.summingInt(i->i));
System.out.println(sum);
System.out.println("--Using Collectors.summarizingInt()--");
IntSummaryStatistics stats = list.stream().flatMap(a->Arrays.stream(a))
.collect(Collectors.summarizingInt(i->i));
System.out.println(stats.getSum());
System.out.println("--Using IntStream.sum()--");
sum = list.stream().flatMap(a->Arrays.stream(a)).
mapToInt(Integer::intValue).sum();
System.out.println(sum);
}
}
输出
--Using Collectors.summingInt()--
81
--Using Collectors.summarizingInt()--
81
--Using IntStream.sum()--
81
Map
获取总数的示例SumOfMapValues.java
package com.concretepage;
import java.util.HashMap;
import java.util.IntSummaryStatistics;
import java.util.Map;
import java.util.stream.Collectors;
public class SumOfMapValues {
public static void main(String[] args) {
Map<Integer, Integer> map = new HashMap<>();
map.put(1, 12);
map.put(2, 24);
map.put(3, 10);
System.out.println("--Using IntStream.sum()--");
int sum = map.values().stream().mapToInt(i->i).sum();
System.out.println(sum);
System.out.println("--Using BinaryOperator--");
sum = map.values().stream().reduce(0, Integer::sum);
System.out.println(sum);
System.out.println("--Using Collectors.summingInt()--");
sum = map.values().stream().collect(Collectors.summingInt(i->i));
System.out.println(sum);
System.out.println("--Using Collectors.summarizingInt()--");
IntSummaryStatistics stats = map.values().stream().collect(Collectors.summarizingInt(i->i));
System.out.println(stats.getSum());
System.out.println("--Using custom method--");
sum = map.values().stream().reduce(0, StatisticsUtility::addIntData);
System.out.println(sum);
}
}
输出
--Using IntStream.sum()--
46
--Using BinaryOperator--
46
--Using Collectors.summingInt()--
46
--Using Collectors.summarizingInt()--
46
--Using custom method--
46
【1】Java 8 Sum: Array, Map and List Collection Example using reduce() and collect() Method