Java8新特性:归约与收集


归约: reduce(T identity,BinaryOperator)/reduce(BinaryOperator) 可以将流中元素反复结合起来,得到一个值

identity 起始值

BinaryOperator  二元运算 

package entity;

public class Employee {
    private String name;
    private int age;
    private double money;

    public double getMoney() {
        return money;
    }

    public void setMoney(double money) {
        this.money = money;
    }

    public Employee() {
    }

    public Employee(String name, int age) {
        this.name = name;
        this.age = age;
    }



    public Employee(String name, int age, double money) {
        this.name = name;
        this.age = age;
        this.money = money;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Employee{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", money=" + money +
                '}';
    }
}
package com;

import entity.Employee;

import java.util.Arrays;
import java.util.List;

public class Main {


    static List employees = Arrays.asList(
            new Employee("aa", 18, 1),
            new Employee("bb", 22, 2),
            new Employee("cc", 33, 3),
            new Employee("dd", 11, 4),
            new Employee("ee", 23, 5),
            new Employee("ff", 68, 6)
    );


    public static void main(String[] args) {
        Double reduce = employees.stream()
                .map((e) -> e.getMoney())
                .reduce((double) 0, (x, y) -> x + y);
        System.out.println("reduce = " + reduce);


    }
}

public static void main(String[] args) {
    Double reduce = employees.stream()
            .map((e) -> e.getMoney())
            .reduce((double) 0, (x, y) -> x + y);
    System.out.println("reduce = " + reduce);


    Optional reduce1 = employees.stream().map((e) -> e.getMoney())
            .reduce((x, y) -> Double.sum(x, y));
    System.out.println("reduce1 = " + reduce1.get());

}

下面的那个返回到是 Optional,为了避免空指针异常来的,然后那个第二个的话,只有一个参数,没有 初始值,所以可能出现空指针异常。

==============================================

============================================

收集

collect:将流转换为其他形式。接收一个Collector接口的实现,用于给Stream中的元素做汇总

package com;

import entity.Employee;

import java.util.*;
import java.util.stream.Collectors;

public class Main {


    static List employees = Arrays.asList(
            new Employee("aa", 18, 1),
            new Employee("bb", 22, 2),
            new Employee("cc", 33, 3),
            new Employee("dd", 11, 4),
            new Employee("ee", 23, 5),
            new Employee("ff", 68, 6)
    );


    public static void main(String[] args) {
        String collect = employees.stream()
                .map((e) -> e.getName())
                .collect(Collectors.joining());
        System.out.println("collect = " + collect);

        System.out.println("==========");

        List list = employees.stream()
                .map((e) -> e.getName())
                .collect(Collectors.toList());
//        for (String l:list){
//            System.out.println(l);
//        }
        list.forEach((x)-> System.out.print(x));

        System.out.println("==========");

        Set collect1 = employees.stream().map((x) -> x.getName())
                .collect(Collectors.toSet());
        collect1.forEach((x)-> System.out.print(x));

        System.out.println("==========");

        HashSet collect2 = employees.stream().map((x) -> x.getName())
                .collect(Collectors.toCollection(HashSet::new));
        collect2.forEach((x)-> System.out.print(x));

        System.out.println("==========");
        Double average = employees.stream()
                .collect(Collectors.averagingDouble((x) -> x.getMoney()));
        System.out.println("average = " + average);

        System.out.println("==========");
        Long count = employees.stream()
                .collect(Collectors.counting());
        System.out.println("count = " + count);

        System.out.println("==============");
        Double collect3 = employees.stream()
                .collect(Collectors.summingDouble((x) -> x.getMoney()));
        System.out.println("collect3 工资总和= " + collect3);

        System.out.println("=============");
        Optional employee = employees.stream()
                .collect(Collectors.maxBy((x, y) -> Double.compare(x.getMoney(), y.getMoney())));
        System.out.println("employee.get() = " + employee.get());

    }
}

z