java - 如何映射 "Try with resources"异常类型?

标签 java functional-programming vavr cyclops-react

在 Cyclops React“尝试使用资源” block 中,我想映射一个 IOException自定义异常类型。我也用 Javaslang 尝试过这个,但似乎不太灵活,因为它对所有异常都一视同仁。

代码示例:

private static Try<String, ConnectionError> readString() {
    // Socket is a thread-local static field
    final Try<String, IOException> string = Try.catchExceptions(IOException.class)
            .init(() -> new BufferedReader(new InputStreamReader(socket.get().getInputStream())))
            .tryWithResources(BufferedReader::readLine);

    return string.isSuccess() ? Try.success(string.get()) :
            Try.failure(new ConnectionError("Could not read from server", string.failureGet()));
}

这可以用更优雅的方式完成吗?或者没有任何意义,最好返回 Try<String, IOException>

免责声明:我是使用 Cyclops React 库和一般函数式编程的新手,所以我可能有严重的概念误解。

最佳答案

从 Javaslang 2.1.0 开始,可以执行以下操作:

Try<String> of = Try.withResources(() -> new BufferedReader(new InputStreamReader(socket.get().getInputStream())))
                    .of(BufferedReader::readLine)
                    .mapFailure(
                        Case(instanceOf(IOException.class), ConnectionError::new)
                    );

即我们添加了 Try.withResources功能,现在能够映射故障。

mapFailure方法采用可变数量的匹配案例。当异常不匹配(因此未映射)时,原始异常仍然存在。

我认为将异常类型作为 Try 的一部分包含在内是没有意义的签名,例如Try<String, IOException> ,因为计算可能会抛出多个异常之一。

指定一组可能的异常类型也无济于事,因为当编译器计算泛型的上限时类型信息会丢失。

免责声明:我是 Javaslang 的创造者

关于java - 如何映射 "Try with resources"异常类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42979088/

相关文章:

java - Spring +Ehcache : Not able to get the cache back from cacheManager without key

java - 递归迷宫遍历算法

functional-programming - 我应该在 OCaml 的 List 上实现 PriorityQueue (Heap) 吗?

java - 当 javaslang Try 流包含异常时如何抛出

java - VAVR Match(Option).of() 无法正常工作

java - Vavr 中列表上的模式匹配对象分解

java - 在 Spring-Security 中,j_spring_security_logout 到底是什么?我听说它被称为 "handler"但我不确定那是什么意思

java - URL 在 webapps 文件夹中不存在

kotlin - 基于函数式风格的谓词对列表的连续元素进行分区

haskell - 使用 Control.Lens 组合镜头,其中必须调用中间函数