【发布时间】:2016-02-01 22:19:33
【问题描述】:
我想知道如何强制对 Java8 中的每个地图函数进行立即评估?我现在的情况是我需要进行多级转换(从 ObjectA -> ObjectB -> ObjectC -> ObjectD),并且对于某些对象,在此转换的每个级别上都可能出现失败(抛出异常)。例如
// stream -> map -> collect sequence
lists.stream()
.map(aToB)
.collect(Collectors.toList())
.stream()
.map(bToC)
.collect(Collectors.toList())
.stream()
.map(cToD)
.collect(Collectors.toList())
// Try api is from javaslangs
Function<ObjectA, ObjectB> aToB = a -> Try.of(() -> .....)
.onFailure(....)
.get();
Function<ObjectB, ObjectC> bToC = b -> Try.of(() -> .....)
.onFailure(....)
.get();
Function<ObjectC, ObjectD> cToD = c -> Try.of(() -> .....)
.onFailure(....)
.get();
我想测试我的单元测试中的每个转换,例如测试测试是否抛出异常,以及如果在将 A 转换为 B 时出现异常时 A 未成功转换为 C 类似的东西,但是通过惰性评估,这变成无法测试,我能想到的唯一方法是执行此steam() -> map(...) -> collect(...) 调用序列以强制立即评估。我想知道有没有更好的方法来写这个。
【问题讨论】:
-
为什么?将所有
map链接起来有什么问题? -
我不明白这个问题。当您收集最终结果时,所有函数都已应用于所有流元素,或者,如果任何评估失败,异常将传播给调用者,因此您已经测试了所有函数。如果出现异常,堆栈跟踪会告诉您哪个函数失败了。那么你想用这些中间的
.collect(Collectors.toList()).stream()解决什么样的问题呢?除了性能之外,它们不会改变任何东西。 -
每种情况下是抛出不同的异常,还是同一个异常?
-
如果你想要N个单独的评估,写N个流管道,并在每个之后立即测试结果。试图用一种大表情来做这件事只会分散注意力。
标签: java lambda functional-programming java-8 java-stream