Я пытаюсь преобразовать 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.
Дайте мне знать, как решить эту проблему.