使用Java 8 Streams创建和反转MultiMap

mat*_*ian 6 multimap java-8 java-stream flatmap

如何将a Set<Result>转换为Map<Item, Set<String>>SetMultimap<Item, String>使用Java 8流或Multimaps,其中Result:

class Result {
    String name;
    Set<Item> items;
}
Run Code Online (Sandbox Code Playgroud)

例如,我从:

result1:
    name: name1
    items:
        - item1
        - item2
result2:
    name: name2
    items:
        - item2
        - item3
Run Code Online (Sandbox Code Playgroud)

并以:

item1:
    - name1
item2:
    - name1
    - name2
item3:
    - name2
Run Code Online (Sandbox Code Playgroud)

hol*_*ava 5

下面代码片段中的两个重要方法是Stream.flatMapCollectors.mapping

import java.util.Map.Entry;
import java.util.AbstractMap.SimpleEntry;
import static java.util.stream.Collectors.*;

results.stream()
    //map Stream<Result> to Stream<Entry<Item>,String>
   .flatMap(it -> it.items.stream().map(item -> new SimpleEntry<>(item, it.name)))
   //group Result.name by Item 
   .collect(groupingBy(Entry::getKey, mapping(Entry::getValue, toSet())));
Run Code Online (Sandbox Code Playgroud)