Создание карты из вложенных списков - PullRequest
0 голосов
/ 09 января 2020

Предположим, есть 3 класса:

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

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

class Level3 {  
    int idLevel3;
    String name;
}   

Предположим, что существует список объектов уровня 1, называемый начальным состоянием

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

Я хочу создать карту из initialList где:

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

Я могу добиться этого, используя циклы for, но я хочу добиться этого более элегантным способом, используя функции Java 8 (потоки и функции). Я пытался использовать Collectors.toMap (), также пытался группировать, но я не могу получить нужную карту.

Ответы [ 3 ]

1 голос
/ 09 января 2020

В соответствии с idLevel1 я сделал предположение, что вы хотите список всех idlevel3, которые были в chain для определенного idLevel1

Так что может быть список level3 ids для некоторых level1 id и другой список level3 ids для других level1 id.

Исходя из этого, это то, что я придумал.

        Map<Integer, List<Integer>> map = initialList
                .stream()
                .collect(Collectors
                        .toMap(lv1 -> lv1.idLevel1,
                                lv1 -> lv1.level2list
                                        .stream()
                        .flatMap(lv2 -> lv2.level3list
                                .stream())
                        .map(lv3 -> lv3.idLevel3)
                        .collect(Collectors.toList())));
1 голос
/ 09 января 2020

Подобный подход к другим:

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())));

Я добавил геттеры в классы yout и изменил одно имя с 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;
    }
}
0 голосов
/ 09 января 2020

У меня есть это, которое является действительным, но у меня нет данных, чтобы проверить это, поэтому, пожалуйста, проверьте это и дайте мне обратную связь:).

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())));
...