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功能函數,即 輸入一個參數,並返回一個參數


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM