Inverse Map, где getValue возвращает список - PullRequest
0 голосов
/ 27 ноября 2018

Я хотел бы преобразовать Map<String, List<Object>>, чтобы оно стало Map<String, String>.Если бы это было просто Map<String, Object>, это просто в Java8;

stream().collect(k -> k.getValue().getMyKey(), Entry::getKey);

Но это не сработает, потому что getValue возвращает List Map<List<Object>, String> в моем примере.Предположим, что Object содержит метод получения, который будет использоваться для ключа, и что Object не содержит ключ на первой карте.

Есть мысли?

Ответы [ 2 ]

0 голосов
/ 27 ноября 2018

Если предпочтением может быть выбор любой среди нескольких значений, отображаемых как ключ , вы можете просто использовать:

Map<String, List<YourObject>> existing = new HashMap<>();
Map<String, String> output = new HashMap<>();
existing.forEach((k, v) -> v.forEach(v1 -> output.put(v1.getMyKey(), k)));

По сути, это поместит«первый» такой myKey вместе с соответствующим значением, которое было key существующей карты.

0 голосов
/ 27 ноября 2018

Перейдите к списку объектов и извлеките нужный вам ключ. map -> flatten -> toMap

source.entrySet()
      .stream()
      .flatMap(e -> e.getValue()
                     .stream()
                     .map(x -> new SimpleEntry<>(x.getMyKey(), e.getKey())))
      .collect(toMap(SimpleEntry::getKey, SimpleEntry::getValue));

используйте функцию слияния, если ожидаетсядубликаты getMyKey() значений:

source.entrySet()
      .stream()
      .flatMap(e -> e.getValue()
                     .stream()
                     .map(x -> new SimpleEntry<>(x.getMyKey(), e.getKey())))
      .collect(toMap(SimpleEntry::getKey, SimpleEntry::getValue, (l, r) -> l));

Примечание: вышеизложенное использует ключи исходной карты в качестве значений итоговой карты, поскольку это то, что вы, кажется, иллюстрируете в своем посте, еслиоднако вы хотите, чтобы ключ исходной карты оставался в качестве ключа полученной карты, а затем измените new SimpleEntry<>(x.getMyKey(), e.getKey()) на new SimpleEntry<>(e.getKey(),x.getMyKey()).

...