Java 流收集以使用多个键进行映射

Gar*_*son 3 java key collect java-stream

我以为我已经很擅长 Java 8 流了,但后来……

我有一个Foo界面:

public interface Foo {
  String getKey();
  Stream<Bar> bars();
}
Run Code Online (Sandbox Code Playgroud)

我知道我可以使用每个键Stream<Foo>将 a收集到 aMap<String, Foo>中:

Map<String, Foo> foosByKey = fooStream.collect(
    Collectors.toMap(Foo::getKey, Function.identity()));
Run Code Online (Sandbox Code Playgroud)

但是如果我想将它们收集到一个Map<Bar, Foo>? 换句话说,对于FooSteamFoo中的每一个,我想把它放在映射到BarFoo.bars(). 我从哪里开始?

Sot*_*lis 7

正如此处所建议的,您需要Bar从每个值中提取值Foo并创建它们对。获得配对后,您可以将它们收集到一个Map. 例如,

Map<Bar, Foo> map = fooStream.flatMap(foo -> foo.bars().map(bar -> new SimpleEntry<>(bar, foo)))
            .collect(Collectors.toMap(Entry::getKey, Entry::getValue)); 
Run Code Online (Sandbox Code Playgroud)

我们SimpleEntry在这里使用是因为它可用(Java 没有更简单的Pair类型)。你可以自己写一个更具体的。

  • Java 9 将添加使用`Map.entry(bar, foo)` 以更简洁的方式构造基于值的不可变条目的可能性。 (4认同)