虽然上次我说filter方法有点类似于hadoop的Mapreduce,不过实际上stream提供了一个自己的方法也叫 reduce
通常情况下这个方法接受两个参数, 一个初始值,一个Lambda表达式
下面是一个求和的例子
int total = students.stream().map(Student::getScore).reduce(0,(a,b)->a+b);
上面这个等价于 Optional<Integer> sum = students.stream().map(Student::getScore).reduce(Integer::sum);
首先我们把Students的list用map方法取出score, 然后初始值设置成0, 第一个值是0+80=80, 第二个值是80+81=161… 以此类推
取乘积的话可以用 int product = students.stream().map(Student::getScore).reduce(1,(a,b)->a*b);
这个方法还有一个不需要提供初始值的版本
Optional<Integer> sum = students.stream().map(Student::getScore).reduce((a,b)->a+b);
使用此版本取最大数
Optional<Integer> max = students.stream().map(Student::getScore).reduce(Integer::max);
如果你跟我一样好奇,我们看一下Interger的max方法源码 ( 还是接受两个参数的静态函数 )
public static int max(int a, int b) {
return Math.max(a, b);
}
package com.stream;
import java.util.ArrayList;
import java.util.List;
public class TestStream {
public static void main(String args[]){
List<Student> students = new ArrayList<Student>();
students.add(new Student(80));
students.add(new Student(81));
students.add(new Student(82));
students.add(new Student(83));
students.add(new Student(91));
students.add(new Student(92));
int total = students.stream().map(Student::getScore).reduce(0,(a,b)->a+b);
System.out.println(total);
}
}
class Student{
int score;
Student(int score){
this.score = score;
}
public int getScore() {
return score;
}
public void setScore(int score) {
this.score = score;
}
}
