collectingAndThen的使用姿势

public class AdvancedStreamingP2 {

    public static void main(String[] args) {

        List<Student> studentList = Student.generateData();
        collect(studentList);
        collectingAnd(studentList);
    }

    private static void collect(List<Student> studentList) {
        System.out.println("\n---------- Extracting Student Name with Max Age by Type -----------");
        Map<String, Optional<Student>> stuMax = studentList.stream().collect(groupingBy(Student::getType, maxBy(comparing(Student::getAge))));
        stuMax.forEach((k, v) -> System.out.println("Key : " + k + ", Value :" + v.get()));
    }

    /**
     * I want to extract the student name, with the max age, grouping student by Type. Is it possible by using any combination in "collect" itself?
     *
     * I want the output like :
     *
     * ---------- Extracting Student Name with Max Age by Type -----------
     *
     * Key : School, Value : Aman
     * Key : College, Value : Ajay
     */
    private static void collectingAnd(List<Student> studentList) {
        Map<String, String> stuMax =
                studentList.stream()
                        .collect(groupingBy(
                                Student::getType,
                                collectingAndThen(maxBy(comparing(Student::getAge)),v -> v.get().getName())
                        ));
        System.out.println(stuMax);
    }
}
public class Student{
    String name;
    int age;
    String type;

    public Student(){}

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

    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;
    }

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }

    @Override
    public String toString() {
        return "Student{" +
                "name=‘" + name + ‘\‘‘ +
                ", age=" + age +
                ", type=‘" + type + ‘\‘‘ +
                ‘}‘;
    }

    public static List<Student> generateData() {

        List<Student> st = Arrays.asList(new Student("Ashish", 27, "College"),
                new Student("Aman", 24, "School"),
                new Student("Rahul", 18, "School"),
                new Student("Ajay", 29, "College"),
                new Student("Mathur", 25, "College"),
                new Student("Modi", 28, "College"),
                new Student("Prem", 15, "School"),
                new Student("Akash", 17, "School"));
        return st;
    }
}

collect方法输出参数较多,优化后的collectingAnd方法使用了collectingAndThen

顾名思义,即收集并处理,处理函数是 Function功能函数,即 输入一个参数,并返回一个参数

collectingAndThen的使用姿势

上一篇:基于DotNet构件技术的企业级敏捷软件开发平台 - AgileEAS.NET平台开发指南 - 数据访问


下一篇:Linux常见问题:Linux自有服务、Linux进程检测与控制、YUM包管理工具与LAMP架构