Я пытаюсь выполнить эту итерацию, используя поток java 8 вместо традиционного цикла for.
У меня есть список объектов List<Obligation>
и Obligation имеет List из String внутри.
Obligation содержит такие поля, как
f1 и f2 типа String,
а также
f3 типа List<String>
Чего я хочу добиться, так это Map<String, List<Obligation>> такого, что String, используемое в ключе Map, представляет собой каждое значение, присутствующее в List<String> от каждого Obligation в List<Obligation>
Вот как код будет выглядеть в традиционном цикле for:
// newly initialized Map
Map<String, List<Obligation>> map = new LinkedHashMap<String, List<Obligation>>();
// assume the list is populated
List<Obligation> obligations = someMethod();
for(Obligation obligation : obligations) {
for(String license : obligation.getLicenseIDs()) {
if (map.containsKey(license)) {
map.get(license).add(obligation);
} else {
List<Obligation> list = new ArrayList<Obligation>();
list.add(obligation);
map.put(license, list);
}
}
}




Используйте flatMap, чтобы создать поток пар Obligation и идентификаторов лицензий, а затем используйте groupingBy, чтобы собрать их по идентификатору лицензии.
Map<String, List<Obligation>> map =
obligations.stream() // Stream<Obligation>
.flatMap(o -> o.getLicenseIDs()
.stream()
.map(id -> new SimpleEntry<>(o,id))) // Stream<Map.Entry<Obligation,String>>
.collect(Collectors.groupingBy(Map.Entry::getValue,
Collectors.mapping(Map.Entry::getKey,
Collectors.toList())));
Вопрос хорошо объяснен, хорошие усилия новичка здесь.