Java8 Как преобразовать 3-уровневый вложенный список во вложенный HashMap, используя stream и lambda - PullRequest
2 голосов
/ 04 октября 2019

Я пытаюсь преобразовать 3-уровневый вложенный список во вложенный HashMap.

Объявление функции для этого:

Map<Key1, Map<Key2, List<String>>> transformToMap (List<Obj1> inputList)

inputList внутренне имеет вложенный список, который снова имеет вложенный список.

Код, который я написал, использует традиционный цикл for следующим образом:

private Map<Key1 , Map<Key2, List<String>>> reverseLookup(List<Key2> key2List){
    Map<Key1 , Map<Key2, List<String>>>  resultMap = new HashMap<>();
    key2List.forEach(key2->{
        List<ElementObject> elementObjects = key2.getElementObjects();
        elementObjects.forEach(elementObject->{
            final String name = elementObject.getName();
            elementObject.getApplicablePeriods().forEach(applicablePeriod-> {
                Key1 key1 = applicablePeriod.getKey1();
                Map<Key2, List<String>> map2 = resultMap.get(key1);
                if(map2 == null){
                    map2 = new HashMap<>();
                }
                List<String> stringList = map2.get(key2);
                if(stringList == null){
                    stringList = new ArrayList<>();
                }
                stringList.add(name);
                map2.put(key2, stringList);
                resultMap.put(key1, map2);
            });
        });
    });

    return resultMap;
}

Структура класса для него следующая:

class Key2{

    List<ElementObject> elementObjects;

    //getters & setters
}

class ElementObject {
    String name;
    //few more params
    List<ApplicablePeriod> applicablePeriods;
     //getters & setters
}

class ApplicablePeriod{
    Key1 key1;
    //getters & setters
}

class Key1{
    //some parameters
    //getters & setters
}

Приведенный выше код оправдывает мои ожидания.

Каким будет эффективный способ преобразования его в лямбда-поток с использованием Collectors.toMap?

Я пробовалчто-то вроде следующего:

inputList
        .stream()
        .flatMap(item -> item.getObj2List().stream())
        .flatMap(nestedItem -> nestedItem.getKeyList().stream())
        .collect(Collectors.toMap(a-> a.get()))

Но не получить то, что должно быть следующим шагом в Collectors.toMap. Невозможно обработать final String name = nestedItem.getName();, который используется перед третьим циклом for.

Дайте мне знать, как решить эту проблему.

...