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

时间:2017-12-21 10:38:51

标签: java lambda java-8 functional-programming method-reference

假设我们有一个Customer类:

public class Customer {
    private Car[] cars;
    // getter, setter, constructor
}

以及我们需要在汽车上映射的客户集合。

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

Collection<Customer> customers = ...
customers.stream().flatMap(
        customer -> Arrays.stream(customer.getCars())
)...

效果很好,但代码看起来并不优雅。我真的很想用使用通常看起来更可读和更紧凑的方法引用的代码替换它。但是使用数组类型的字段会很难。

问题:有没有办法增强flatMap来电,以便更具可读性/紧凑性/清晰度?

3 个答案:

答案 0 :(得分:11)

您可以将flatMap来电分成两个电话 - mapflatMap - 每个电话都会收到方法参考:

Collection<Customer> customers = ...
customers.stream()
         .map(Customer::getCars)
         .flatMap(Arrays::stream)...

答案 1 :(得分:6)

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

public Stream<Car> cars() {
    return Arrays.stream(cars);
}

然后,您可以像

一样使用它
customers.stream().flatMap(Customer::cars)

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

答案 2 :(得分:3)

您可以使用:

 .map(Customer::getCars)
 .flatMap(Arrays::stream)

但我认为这不再是elegant。而对于我来说,像这样的方法引用一切都使得它的可读性降低。我应该解释一下为什么我认为这不太可读,因为在阅读这段代码时我现在需要理解两个阶段。为什么map完成以及为什么flatMap完成 - 虽然可能看起来很小。