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)
只需添加一个方法来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整洁之外还有其他用途.