java - 一个元素的 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 可能会产生误导。
什么是正确的、可读的、可维护的和最少混淆的方法?
解决方案
这不是一个充分的问题,因为它引发了一场辩论。
如果您的方法合同最多返回 1 个值,则返回 Optional 更具可读性。
如果您的方法合同是流式传输值,则返回 Stream 更具可读性。
您可以根据需要使用 Optional::stream 和 Stream::findFirst 在两者之间进行转换。(java 9 https://docs.oracle.com/javase/9/docs/api/java/util/Optional.html#stream ——)。
推荐阅读
- javascript - 在 Angular 8 中监听 DOM 事件的最佳实践是什么?
- java - Mock private wrapper/primitive/String field
- flutter - 如何将 Flutter Chip 小部件的顶部和底部边距设置为零?
- angular - 如果另一个字段在 Angular 6 中有值,则需要输入
- window - OpenEdge ABL UI 冻结窗口直到弹出窗口关闭
- python-3.x - 在 Linux 上更改用户时保持 Python3 脚本运行
- python - 使用 Pandas 的数据透视表,在末尾添加额外的行并进行减法计算
- javascript - 如何在浏览器上使用 Octokit 的`request.js`?
- java - 包含 Xpath 中的函数
- r - 在多个页面/链接上使用 R 进行网页抓取