我的数据结构如下:
Map<StudentStatus, TreeMap<Integer, Student>> map = new HashMap<>();
我可以要求像PHD这样的学生身份,这会给我一个到Student对象的整数树图。 TreeMap
将学生ID作为键,将学生对象作为值。
public enum StudentStatus {
UNDERGRAD,
POSTGRAD,
PHD;
}
public class Student {
public String name;
public int age;
}
public class StudentDetails {
public int id;
public StudentStatus studentStatus;
public String name;
}
现在,我要按年龄获取最年轻的学生,换句话说,搜索嵌套的地图,并从该学生创建一个StudentDetails对象。因此,我将需要前两张地图的键。第一个键是StudentStatus,第二个键是Student ID。
我找不到在流式传输时存储这些键并在单个语句中使用Java 8 Stream创建最终对象的方法。
我用学生类比简化了这个问题,对于上述问题,使用这样的结构可能没有多大意义,但就我而言,确实如此。
您可以将flatMap
与sorted
一起使用来查找第一个值:
var student = map.values().stream()
.flatMap(m -> m.values().stream())
.sorted(Comparator.comparingInt(Student::getAge))
.findFirst()
.orElseThrow();
如果找不到任何值,将引发异常,但是您可以使用orElse
提供默认值。