我不断地问自己是否创建了 Stream
一个项目的使用是一种良好的实践或对其功能的利用。我们正在讨论这样的代码:
Stream.of(object)
.map(this::doSomething)
.map(this::doSomething)
.findAny();
喜欢Optionals
, Streams
使得在 Java 中实现更具声明性的代码成为可能,而无需将指令绑定(bind)为函数并进行组合:
Function<x, y> doSomething = // some computation
Function<x, y> doSomethingElse = // other computation
doSomething.andThen(doSomethingElse).apply(object) // or using compose
绑定(bind)中间变量的经典风格会生成如下代码:
var x = doSomething(object)
var y = doSomethingElse(x)
虽然仍然完全有效和可读,但使用流构造我们获得了顺序组合几个小函数的自由 - 在我看来这会导致更好的代码(很容易插入新的函数调用)。
我可以将其破解为:
identity(Value.class)
.andThen(this::doSomething)
.andThen(something::execute)
.andThen(this::doSomethingElse)
.apply(value);
但我需要一个通用方法,例如:
private <T> UnaryOperator<T> identity(Class<T> t) {
return UnaryOperator.identity();
}
我当然可以想出重用这段代码的方法,但我觉得应该有一个更好的、原生的方式来启动这个函数链。
有一些 Java 原生的东西或者更好的方法来启动这个函数组合链,而不需要将函数绑定(bind)到名称?
最佳答案
恕我直言,这感觉有点过分了。
在后台,许多对象被实例化来完成这样一个简单的任务。
Stream
在这里管理元素流。
还有
.findAny();
.findFirst();
实际上并不适合这种情况,主要是因为它们返回 Optional<T>
即使您知道结果总是存在,您也必须处理它。
关于 Optional.of
,为什么Optional
?我的意思是,这里没有什么可选的,你知道值(value)就在那里。这是误导性的。使用Optional
一旦放错地方,你就会把它弄得到处都是。
创建对象的多个连续方法调用没有任何问题 B
从一个对象开始A
。
关键点是不变性和中间状态。只需使用不可变的定义就可以了。
请记住,Java 并不是功能第一(仍然如此)。
<小时/>无论如何,您可能会对 RxJava 感兴趣或FunctionalJava .
关于java - 使用仅一项的 java Streams 作为计算上下文 - 好不好?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55208952/