这是java 8的Stream的一个很好的用例:
final Car carWithInterior = Stream.of(carWithEngine)
.map(car -> installSeats.execute(car))
.map(car -> installDashBoard.execute(car))
.map(car -> installSunRoof.execute(car))
.collect(car);
carWithEngine是一辆车.请注意,有时即使汽车(带仪表板)传递给installSunroof,它也不会做任何事情,因为屋顶上没有洞.我应该总是在安装/映射过程结束时获得一辆汽车.
安装顺序是必需的(这就是为什么我想流式传输它),下一次安装有时可能需要传递汽车实例的参数来执行它的操作.
>这是java 8的Stream的一个很好的用例吗?
> Obvioulsy,我最后的收集是不对的.我应该如何在安装/装配线的末端安装汽车? findFirst().get()会起作用,但我觉得这很糟糕,因为即使安装没有对carWitEngine做任何事情,我也应该总是得到一辆车,而且我不会流多个元素.
我不确定汽车是如何组装的,但是为了这个类比,你可以说在添加内饰之前需要先放置发动机
解决方法:
因为您希望对单个对象执行操作. Java 8 Optional是合适的.
如果这些地图操作中的每一个都只是为Car对象提供保湿,那么构建模式(Phil C的评论)绝对值得一游.
>点击打开单个对象的流不是流的好用例.
>如果汽车通过.map()操作掉入流中,你就冒险进入危险区域(副作用).处理Streams时,强烈建议按照预期的方式使用这些操作.如果您打算从流中删除元素.filter()
编辑OP的编辑:
关于“序列”以及它的翻译方式存在一些根本性的混淆
可选的
car => map(execute) => map(execute) => transformedcar
流
[car1, car2, car3]
=> map(execute) => map(execute) => updatedcar1 | => findFirst (Optional)
=> map(execute) => map(execute) => updatedcar2 |
=> map(execute) => map(execute) => updatedcar3 |
collect
[updatedcar1, updatedcar2, updatedcar3]
findFirst方法将返回一个Optional.
collect方法将提供终端操作,允许您聚合/缩小/分组这些结果.
这些映射操作“顺序地”转换传递的元素.但是,Stream应该是适当的情况,你必须处理许多或“序列”汽车.
重温#2
您可以选择使用Optional with orElse(car)提供替代方案.
但这是你必须对你正在表现的副作用有争议的地方.
如果execute方法正在操作并返回传递给它的同一对象,则会产生意想不到的后果.我将使用Optionals作为示例,但同样适用于Streams.
private final Car car Optional.of(carWithEngine)
.map(installSunroof.execute) //
.map(installDashboard.execute) //
.orElse(carWithEngine) //
标签:java,design-patterns
来源: https://codeday.me/bug/20190727/1549435.html