使用Java 8 Stream API在嵌套映射中查找最小/最大元素

问题描述 投票:0回答:1

我的数据结构如下:

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创建最终对象的方法。

我用学生类比简化了这个问题,对于上述问题,使用这样的结构可能没有多大意义,但就我而言,确实如此。

java dictionary java-8 stream java-stream
1个回答
1
投票

您可以将flatMapsorted一起使用来查找第一个值:

var student = map.values().stream()
    .flatMap(m -> m.values().stream())
    .sorted(Comparator.comparingInt(Student::getAge))
    .findFirst()
    .orElseThrow();

如果找不到任何值,将引发异常,但是您可以使用orElse提供默认值。

© www.soinside.com 2019 - 2024. All rights reserved.