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