Java8流:使用子字段中的值进行映射

Java8流:使用子字段中的值进行映射,java,java-8,java-stream,Java,Java 8,Java Stream,我正在尝试创建一个地图fooMoos 来自以下类结构: class Foo { String id; Bar bar; } class Bar { List<Moo> moos; } List<Foo> foos; 如果moos直接成为Foo的一个领域,我会这么做 Map<String, List<Moo>> fooMoos = foos.stream().collect(Collectors.toMap(Foo::g

我正在尝试创建一个地图fooMoos

来自以下类结构:

class Foo {
    String id;
    Bar bar;
}

class Bar {
    List<Moo> moos;
}

List<Foo> foos;
如果moos直接成为Foo的一个领域,我会这么做

Map<String, List<Moo>> fooMoos = foos.stream().collect(Collectors.toMap(Foo::getId, Foo::getMoos));
但是如何处理子字段呢?有像Foo::getBar::getMoos这样的东西吗


我觉得这里需要一个平面图,但不知道怎么做。

函数引用很有用,但不支持链接。你需要使用像这样的lambda

foo -> foo.bar.moos


函数引用很有用,但它们不支持链接。你需要使用像这样的lambda

foo -> foo.bar.moos


使用短lambda要简单得多。但是如果您真的想坚持方法引用,可以通过链接函数来实现。例如,使用Function.and然后:

与上述类似,中有一个静态方法Functions.compose,它允许您使用泛型类型推断来避免显式强制转换:

Map<String, List<Moo>> fooMoos = foos.stream().collect(Collectors.toMap(Foo::getId,
        Functions.compose(Bar::getMoos, Foo::getBar)));

使用短lambda要简单得多。但是如果您真的想坚持方法引用,可以通过链接函数来实现。例如,使用Function.and然后:

与上述类似,中有一个静态方法Functions.compose,它允许您使用泛型类型推断来避免显式强制转换:

Map<String, List<Moo>> fooMoos = foos.stream().collect(Collectors.toMap(Foo::getId,
        Functions.compose(Bar::getMoos, Foo::getBar)));

Collectors.toMapFoo::getId,foo->foo.bar.moosI完全忘记了,您也可以在那里使用lambdas。谢谢。这似乎是一种常见的模式,忘记lambdas或不惜一切代价尝试使用方法引用…收集器。toMapFoo::getId,foo->foo.bar.moosI完全忘记了,你也可以在那里使用lambdas。谢谢。这似乎是一种常见的模式,忘记lambdas或者不惜一切代价尝试使用方法引用……很好。太糟糕了,只有一个被接受的答案:-很好。太糟糕了,只能有一个公认的答案:-
Map<String, List<Moo>> fooMoos = foos.stream().collect(Collectors.toMap(Foo::getId,
        Functions.compose(Bar::getMoos, Foo::getBar)));