为什么java没有Try monad?

时间:2018-04-04 08:50:04

标签: java try-catch monads

在我看来,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 */)

任何人都可以解释为什么吗?它与其他一些规范缺乏有关吗?

感谢所有人。

1 个答案:

答案 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有一些问题:没有元组支持,没有对基元的泛型支持,检查异常。