java 映射对象_java – 使用Stream映射单个对象

这是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

你可能感兴趣的:(java,映射对象)