Java 8 Groupingby基于可以为null的属性的对象列表

Java 8 Groupingby基于可以为null的属性的对象列表,java-8,collectors,groupingby,Java 8,Collectors,Groupingby,我有一个学生对象列表,如下所示 Student1 DOB : 12/02/2010 Student2 DOB : 12/03/2010 Student1 DOB : 12/04/2010 Student4 DOB : Student2 DOB : Student3 DOB : 12/01/2010 Student{ String name; Date dob; } 我想根据DOB对学生进行分组,如下所示 Student1 DOB : 12/02/2010 Student2

我有一个学生对象列表,如下所示

Student1  DOB : 12/02/2010
Student2  DOB : 12/03/2010
Student1  DOB : 12/04/2010
Student4  DOB : 
Student2  DOB :
Student3  DOB : 12/01/2010

Student{
String name;
Date dob;
}
我想根据DOB对学生进行分组,如下所示

Student1  DOB : 12/02/2010
Student2  DOB : 12/03/2010
Student1  DOB : 12/04/2010
Student4  DOB : 
Student2  DOB :
Student3  DOB : 12/01/2010

Student{
String name;
Date dob;
}
  • 所有学生应根据学生姓名分组
  • 学生必须按照dob的降序排列
  • 同样的学生分组 两者应按dob的降序排列
  • 其余学生对象的顺序必须与输入列表中的顺序相同
  • 我在这里找到了一个匹配的解决方案 ,但如果dob为null,则它将不起作用。java8中是否有使用流的解决方案

    根据以上链接步骤1,我已尝试

    Map<String, Optional<Student>> students = students.stream()
        .collect(Collectors.groupingBy(
                 Student::getName,
                 Collectors.maxBy(Comparator.comparing(o -> o.getDob()))));
    
    Map students=students.stream()
    .collect(收集器.groupingBy(
    学生::getName,
    Collectors.maxBy(Comparator.comparing(o->o.getDob()));
    

    这里getDob()有时会返回null,并抛出null指针异常。筛选器不是解决方案,因为它将完全避免dob为null的学生。

    如果属性为
    null
    ,您希望实际执行什么比较<代码>比较.nullsLast类型示例可能有帮助您所说的
    学生按dob降序排列是什么意思。
    ?点
    3
    剩余学生对象之间的区别是什么
    意味着每组都有空的DOB元素?@Rono修改了这个问题。第3点指出,在输出中,必须保持顺序Student1 DOB:12/03/2010 Student1 DOB:12/01/2010@Tester
    比较器。比较(o->o.getDob())
    。试着用方法引用替换它:
    Comparator.comparating(Student::getDob)
    第2点和第3点之间的区别是什么?当您想按顺序获取对象时,为什么要使用
    maxBy
    ?顾名思义,它将计算到最大元素,换句话说,一个元素。如果属性为
    null
    ,您希望实际执行什么比较<代码>比较.nullsLast类型示例可能有帮助您所说的
    学生按dob降序排列是什么意思。
    ?点
    3
    剩余学生对象之间的区别是什么
    意味着每组都有空的DOB元素?@Rono修改了这个问题。第3点指出,在输出中,必须保持顺序Student1 DOB:12/03/2010 Student1 DOB:12/01/2010@Tester
    比较器。比较(o->o.getDob())
    。试着用方法引用替换它:
    Comparator.comparating(Student::getDob)
    第2点和第3点之间的区别是什么?当您想按顺序获取对象时,为什么要使用
    maxBy
    ?顾名思义,它将计算到最大元素,换句话说,一个元素。