java - 使用仅一项的 java Streams 作为计算上下文 - 好不好?

标签 java java-stream

我不断地问自己是否创建了 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/

相关文章:

java - 如何逐步执行所有线程

java - 如何在 Java 中检索数组值?

java - 如何在JAVA中找到区分大小写的字符串并忽略它

java - 如何使用Optional.ofNullable和Stream

java - 流减少不正确地使用长类型

java - 按日期分组项目

java - 从搜索表单动态构建 WHERE 子句时如何防止 SQL 注入(inject)?

java - 如何从 application.yml 映射时间属性?

java - C# 中的 BiPredicate 模拟

java - 在任何其他中间方法之前,如何在 Java 8 流打开时运行单个函数?