Lambda将List转换为共享值的Map到唯一值的列表

Thi*_*aku 1 java lambda java-stream

我有一个Foo包含两个重要属性的列表,Bar barBaz baz.实例可以共享Bar值但具有唯一的Bazs.

我想将此List转换为Map,Baz以便共享a的所有实例的唯一值Bar放在映射到该共享的Set中Bar.

Map<Bar, Set<Baz>> m = new HashMap<>();
for (Foo foo : fooRepository.findAll()) {
    if (m.containsKey(foo.bar)) {
        m.get(foo.bar).add(foo.baz);
    } else {
        Set<Baz> set = new HashSet<>();
        set.add(foo.baz);
        m.put(foo.bar, set);
    }
}
Run Code Online (Sandbox Code Playgroud)

我自己的功能印章尚未证明完成任务.我试图将两者reducecollectList一起尝试但在尝试将不同的参数实现为lambdas时因类型问题而被绊倒.

尝试使用Collect

m = fooRepository.findAll().stream().collect(new HashMap<Bar, Set<Baz>>(), (m, foo)->m.merge(Foo::getBaz, s->s.add(foo.getBar()));
Run Code Online (Sandbox Code Playgroud)

不完整,编译器无法确定m或foo和Foo :: getBaz的类型.

Reduce不起作用,因为它不允许累加器与元素具有不同的值.

shm*_*sel 7

Map<Bar, Set<Baz>> m = fooRepository.findAll()
        .stream()
        .collect(Collectors.groupingBy(Foo::getBar,
                Collectors.mapping(Foo::getBaz, Collectors.toSet())));
Run Code Online (Sandbox Code Playgroud)