Список лямбда-групп Java 8 на карте - другой ключ, если в ключе более одного элемента списка - PullRequest
1 голос
/ 03 июня 2019

У меня есть список отношений.У каждого объекта отношения есть три переменные: personA, personB и RelationsType.

У объекта RelationsType есть две переменные: Relations (Son) и RelationsPlural (Sons)

У меня есть требование, в котором мне нужно перечислитьотношения человека.Если у человека есть одна жена, это будет:

Wife      <wifeName>

Если у человека более одного сына, это будет:

    Sons      <firstSonName>
              <secondSonName>

Есть ли простое лямбда-выражение, где яможет превратить список отношений в map<String,List<relationship>>, где, если ключ имеет список с более чем одним элементом, тогда значением ключа является значение RelationsType.relationshipPlural?

Единственный вариант, который я могу придумать, - это использоватьдва выражения,

1) Collectors.toMap(), чтобы создать карту relationsType, а затем

2) обработать карту, чтобы создать другую карту, ключом которой будет RelationsType.relationshipPlural, если значение картысписок с более чем одним значением.

Заранее спасибо

1 Ответ

2 голосов
/ 03 июня 2019

Вы можете попробовать использовать collectingAndThen с groupingBy в качестве нисходящего потока, как:

private Map<String, List<RelationShip>> groupAndMapRelationships(List<RelationShip> relationShips) {
   return relationShips.stream()
           .collect(Collectors.collectingAndThen(
                   Collectors.groupingBy(RelationShip::getRelationshipType),
                   map -> map.entrySet().stream()
                           .map(e -> new AbstractMap.SimpleEntry<>(
                                   e.getValue().size() == 1 ?
                                           e.getKey().getRelationship() : e.getKey().getRelationshipPlural(),
                                   e.getValue()))
                           .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue))));
}

, где минимальные POJO, которые я рассматривал, будут выглядеть так:

@Getter
class RelationShip {
    String personA;
    String personB;
    RelationshipType relationshipType;
}

@Getter
class RelationshipType {
    String relationship;
    String relationshipPlural;
}
...