在我看来,Java 8及更高版本(实际上是9和10)缺乏有效使用Stream
和其他monad的部分。 Java没有任何类型的Try
monad来处理monad组合期间的错误。
为什么呢?最初,我认为只缺少版本8,但我没有找到任何JEP来在JDK中引入它。
以下内容可能是一个起点。
public class Try<T> {
private T value;
private Exception exception;
private Try(Supplier<T> supplier) {
try {
this.value = supplier.get();
} catch (Exception ) {
this.exception = ex;
}
}
Optional<T> toOptional() {
return Optional.ofNullable(value);
}
public static <T> Try<T> of(Supplier<T> supplier) {
return new Try<>(supplier);
}
// Some other interesting methods...
}
也许没有人使用反应流,但在流转换过程中,您需要一些智能方法来收集异常,而不会破坏整个流的执行。
stream
.map(info -> {
// Code that can rise an exception
// Without the Try monad is tedious to handle exceptions!
})
.filter(/* something */)
.to(/* somewhere */)
任何人都可以解释为什么吗?它与其他一些规范缺乏有关吗?
感谢所有人。
答案 0 :(得分:2)
如果是Try,它将用于替换代码:
int result;
try {
result = otherMethod();
} catch(exception ex) {
result = 0;
}
使用:
result = Try.of(()->otherMethod()).orElse(0);
它更短但上面的代码是&#34; Pokemon Exception Handling&#34;反模式。忽略异常并不是你想要的代码,并且使它变得更容易也不是一个好主意。
没有技术原因没有Try
。像VAVR这样的第三方功能编程库包括在内。将功能元素移植到Java有一些问题:没有元组支持,没有对基元的泛型支持,检查异常。