如何在Java8中强制立即评估流

pet*_*ter 6 java lambda functional-programming java-8 java-stream

我想知道如何强制立即评估Java8中的每个map函数?我现在的情况是我需要进行多个级别的转换(来自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();
Run Code Online (Sandbox Code Playgroud)

我想测试我的单元测试中的每个转换,例如测试是否测试抛出异常,以及如果A在将A转换为B之类的异常时未成功转换为C,但是使用惰性求值,则无法测试,我能想到的唯一方法是做这一系列的steam() -> map(...) -> collect(...)调用,迫使立即进行评估.我想知道是否有更好的方式来写这个.

Lou*_*man 4

这里有一些简单的想法:

  • 测试单元素集合上的整个流操作链。验证异常是否在您期望的位置引发。
  • 不用担心测试流框架;只需在测试中直接应用这些函数,而不是通过流。

一般来说,不要尝试在测试中处理惰性求值:测试函数,并信任流框架在实际代码中做正确的事情。