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中的每一个,我想把它放在映射到Bar由Foo.bars(). 我从哪里开始?
正如此处所建议的,您需要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类型)。你可以自己写一个更具体的。