一、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 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变量中。
原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/283522.html