在数组映射期间将lambda替换为flatMap中的方法引用

Sas*_*ota 8 java lambda functional-programming java-8 method-reference

假设我们有一个Customer班级:

public class Customer {
    private Car[] cars;
    // getter, setter, constructor
}
Run Code Online (Sandbox Code Playgroud)

和我们需要在汽车上映射的客户的集合.

目前我正在以某种方式这样做:

Collection<Customer> customers = ...
customers.stream().flatMap(
        customer -> Arrays.stream(customer.getCars())
)...
Run Code Online (Sandbox Code Playgroud)

它运行良好,但代码看起来不优雅.我真的想用使用方法引用的代码替换它,这些代码通常看起来更易读,更紧凑.但是使用数组类型的字段会很难.

问题:有没有任何方法可以增强flatMap呼叫,使其更具可读性/紧凑性/清晰度?

Era*_*ran 11

您可以将flatMap呼叫拆分为两个呼叫 - map并且flatMap- 每个呼叫接收方法参考:

Collection<Customer> customers = ...
customers.stream()
         .map(Customer::getCars)
         .flatMap(Arrays::stream)...
Run Code Online (Sandbox Code Playgroud)


Hol*_*ger 6

只需添加一个方法来Customer返回Cars 流.使用典型的命名约定,它看起来像

public Stream<Car> cars() {
    return Arrays.stream(cars);
}
Run Code Online (Sandbox Code Playgroud)

然后,你可以像使用它一样

customers.stream().flatMap(Customer::cars)
Run Code Online (Sandbox Code Playgroud)

通常,应谨慎处理类似数组的可变类型的属性.防止通过getter进行修改的唯一方法是制作副本.因此,提供一种替代方法,返回像a Stream这样不需要复制的只读类型,除了flatMap整洁之外还有其他用途.

  • 这种方法的另一个优点是,如果汽车数组为"null",你也可以在方法中处理这种情况:`return cars == null?Stream.empty():Arrays.stream(cars);` (5认同)