一、stream简介
Java8中加入了一个新的包java.util.stream
,这个包中包含了一些可以用来支持函数式编程风格的类。这些操作被称为中间操作和最终操作。Stream的中间操作会返回一个新的Stream对象,比如filter
、map
、sorted
等,而最终操作会返回一个结果,比如count
、sum
、reduce
等。使用Stream的好处是可以把数据操作流程化,并且可以对数据进行并行处理。其中求和是Stream对象最常用的操作之一。
二、求和方法
Stream API提供了两种求和方法,分别为sum()
和reduce()
。
1. sum()
方法
IntStream intStream = IntStream.of(1, 2, 3, 4, 5);
int sum = intStream.sum();
sum()
方法是IntStream
接口提供的一个方法,可以对IntStream
对象中的所有元素进行求和。上面的示例代码中,我们首先创建了一个IntStream
对象intStream
,包含了1、2、3、4、5这5个元素。然后通过调用intStream.sum()
方法,对这些元素进行求和,并将结果存储在sum
变量中。
2. reduce()
方法
Stream<Integer> stream = Stream.of(1, 2, 3, 4, 5);
int sum = stream.reduce(0, (a, b) -> a + b);
reduce()
方法是Stream
接口提供的一个方法,可以对Stream
对象中的所有元素进行求和。上面的示例代码中,我们首先创建了一个Stream
对象stream
,包含了1、2、3、4、5这5个元素。然后通过调用stream.reduce()
方法,并传入一个初始值0和一个Lambda表达式(a, b) -> a + b
作为参数,对这些元素进行求和,并将结果存储在sum
变量中。
三、对基本类型求和
Java8的Stream API为基本数据类型提供了特化版本,使其更加高效。我们可以使用IntStream
、LongStream
、DoubleStream
等特化接口来操作int
、long
、double
等基本数据类型。
1. 对IntStream
求和
int[] ints = {1, 2, 3, 4, 5};
int sum = Arrays.stream(ints).sum();
使用Arrays
类的stream()
方法可以将数组转化为Stream。上面的示例代码中,我们首先创建了一个包含了1、2、3、4、5这5个元素的int
类型数组ints
。然后通过调用Arrays.stream(ints)
方法,将其转化为IntStream
类型的对象。调用sum()
方法对这些元素进行求和,并将结果存储在sum
变量中。
2. 对LongStream
和DoubleStream
求和
long[] longs = {1L, 2L, 3L, 4L, 5L};
long sum = Arrays.stream(longs).sum();
double[] doubles = {1.0, 2.0, 3.0, 4.0, 5.0};
double sum = Arrays.stream(doubles).sum();
对于long
和double
类型的基本数据类型,也可以使用相同的方法进行求和。只需要使用LongStream
或者DoubleStream
类型的对象即可。
四、对对象求和
如果需要对一个类的某个属性进行求和,可以使用Stream中的mapToInt()
方法将对象映射为int
类型,并对其进行求和。
示例代码
public class Student {
private String name;
private int score;
public Student(String name, int score) {
this.name = name;
this.score = score;
}
public String getName() {
return name;
}
public int getScore() {
return score;
}
}
public class Test {
public static void main(String[] args) {
List<Student> students = new ArrayList<>();
students.add(new Student("Tom", 80));
students.add(new Student("Jack", 90));
students.add(new Student("Mary", 100));
int sum = students.stream().mapToInt(Student::getScore).sum();
System.out.println(sum);
}
}
上面的示例代码中,我们首先创建了一个Student
类,包含了name
和score
两个属性。然后创建了一个List
对象students
,里面包含了3个Student
对象。最后通过调用students.stream().mapToInt(Student::getScore).sum()
方法,对students
中每个Student
对象的score
属性进行求和,并将结果存储在sum
变量中。