Java8 stream reduce

虽然上次我说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;
    }
    
}