从嵌套列表创建地图

时间:2020-01-08 21:32:14

标签: java collections java-8 functional-programming java-stream

假设有3个类:

class Level1 {
    int idLevel1;
    List<Level2> level2list;    
}

class Level2 {
    int idLevel2;
    List<Level3> level2list;    
}   

class Level3 {  
    int idLevel3;
    String name;
}   

假设有一个称为初始状态的Level1对象列表

List<Level1> initialList = new ArrayList<>();

我想从initialList创建一个地图,其中:

 - Key: is idLevel1
 - Value: is list of all idLevel3 , corresponding to idLevel1

我能够使用for循环来实现这一点,但是我想使用Java 8特性(流和函数)以一种更加优雅的方式实现这一点。 我尝试使用Collectors.toMap()也尝试进行分组,但无法获得所需的地图。

3 个答案:

答案 0 :(得分:1)

通过与idLevel1对应,我假设您想要一个特定idlevel3的{​​{1}}中所有chain的列表

因此,对于某些idLevel1,可能会有level3 ids的列表,而对于不同的level1 id,可能会有level3 ids的不同列表。

基于此,这就是我的想法。

level1 id

答案 1 :(得分:1)

与他人相似的方法:

Map<Integer, List<Integer>> map = initialList.stream()
        .collect(Collectors.toMap(Level1::getIdLevel1,
                lv1 -> lv1.getLevel2list().stream()
                        .flatMap(lv2 -> lv2.getLevel3list().stream().map(Level3::getIdLevel3))
                        .collect(Collectors.toList())));

我在您的课程中添加了吸气剂,并将名称从List<Level3> level2list;更改为List<Level3> level3list;

class Level1 {
    int idLevel1;
    List<Level2> level2list;

    public int getIdLevel1() {
        return idLevel1;
    }

    public List<Level2> getLevel2list() {
        return level2list;
    }
}

class Level2 {
    int idLevel2;
    List<Level3> level3list;

    public List<Level3> getLevel3list(){
        return level3list;
    }
}

class Level3 {
    int idLevel3;
    String name;

    public int getIdLevel3() {
        return idLevel3;
    }
}

答案 2 :(得分:0)

我有这个是有效的,但是我没有数据可以测试它,所以请测试它并给我反馈:)。

Map<Integer, List<String>> map = 
        initialList.stream()
                .collect(Collectors.toMap(f -> f.idLevel1,
                f -> f.level2list.stream()
                .flatMap(f2 -> f2.level2list.stream())
                .collect(Collectors.toList()).stream()
                .filter(f3 -> f3.idLevel3 == f.idLevel1)
                .map(f3 -> f3.name).collect(Collectors.toList())));