gpt4 book ai didi

java - 使用 Stream 映射单个对象

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:05:39 24 4
gpt4 key购买 nike

这是 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 是一个 Car。请注意,有时即使汽车(带仪表板)被传递到 installSunroof,它也不会执行任何操作,因为车顶上没有孔。我应该总是在安装/映射过程结束时得到一辆车

安装顺序是必需的(这就是我想到流式传输它的原因)并且下一次安装有时可能需要来自传递汽车实例的参数来执行它的操作。

  1. 这是 java 8 的 Stream 的一个很好的用例吗?

  2. 很明显,我最后的收集不对。我应该如何在这条安装/装配线的末端取车? findFirst().get() 会工作,但我认为这很糟糕,因为即使安装没有对 carWitEngine 做任何事情,我也应该总是在最后得到一辆车> 而且我不会流式传输多个元素。

我不确定汽车是如何组装的,但为了这个类比,假设您需要先安装发动机,然后再添加内饰

最佳答案

因为您希望对单个对象执行操作。 Java 8 Optional将是合适的。

构建器模式(Phil C 的评论)绝对值得一游,如果这些 map 操作中的每一个都只是简单地为 Car 对象加水。

  1. 为单个对象点击打开流不是流的好用例。
  2. 如果 Car 通过 .map() 操作掉落在流中,您将冒险进入危险区域(副作用)。在处理 Streams 时,强烈建议按预期方式使用这些操作。如果您计划从流 .filter()
  3. 中删除一个元素

编辑到 OP 的编辑:

关于“序列”及其翻译方式存在一些基本的混淆

可选

 car => map(execute) => map(execute) => transformedcar

[car1, car2, car3]
=> map(execute) => map(execute) => updatedcar1 | => findFirst (Optional<Car>)
=> map(execute) => map(execute) => updatedcar2 |
=> map(execute) => map(execute) => updatedcar3 |
collect
[updatedcar1, updatedcar2, updatedcar3]

findFirst 方法将返回一个Optionalcollect 方法将提供一个终端操作,让您聚合/减少/分组这些结果。

这些 map 操作“按顺序”转换传递的元素。但是 Stream 适合您必须处理许多或“一系列”汽车的情况。

重温 #2

您可以选择使用 Optional with orElse(car) 提供替代方案。

但这是您必须对您正在执行的副作用产生争议的地方。

如果 execute 方法正在操作并返回传递给它的同一个对象,将会出现意想不到的后果。例如,我将使用 Optionals,但同样适用于 Streams。

private final Car car Optional.of(carWithEngine)
.map(installSunroof.execute) // <-- updatedCarWithSunroof
.map(installDashboard.execute) // <-- updatedCarWithSunroofAndDashboard
.orElse(carWithEngine) // <-- updatedCarWithSunroofAndDashboard

关于java - 使用 Stream 映射单个对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51887613/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com