首页 > 解决方案 > 一个元素的 Stream 的最佳实践是什么?

问题描述

假设我有一个方法

void doSomething(int x){
  Stream<Long> stream = someUtil.getSomething(x);
}

假设我有一个效用函数someUtil.getSomeStream(x),它返回最大大小为 1 的流。

class SomeUtil {
  /* Returns Stream<Long>, the stream can have size at most 1 */
  public static Stream<Long> getSomething(x){
    Optional<Long> opt = doSomethingWithXAndReturnOptional(x);
    return opt.map(Stream::of).orElse(Stream.empty());
  }
}

我的争论是是否让这个方法返回 a Stream<Long>,它的大小最多为 1 ,而不是 return an Optional<Long>,调用者将像这样转换:

void doSomething(int x){
  Stream<Long> stream = Stream.of(someUtil.getSomething(x).get()); //convert to stream ourselves as the caller
}

我们现在只有一个调用者,doSomething(int x)但这个调用者(以及很可能未来的调用者)更容易期待一个 Stream。同时,我们总是返回大小为 1 的 Stream 可能会产生误导。

什么是正确的、可读的、可维护的和最少混淆的方法?

标签: java

解决方案


这不是一个充分的问题,因为它引发了一场辩论。

如果您的方法合同最多返回 1 个值,则返回 Optional 更具可读性。

如果您的方法合同是流式传输值,则返回 Stream 更具可读性。

您可以根据需要使用 Optional::stream 和 Stream::findFirst 在两者之间进行转换。(java 9 https://docs.oracle.com/javase/9​​/docs/api/java/util/Optional.html#stream ——)。


推荐阅读