关于受检异常和 lambda 表达式的反馈

发布: (2026年2月5日 GMT+8 17:02)
3 min read
原文: Dev.to

Source: Dev.to

Cover image for “Feedback on checked exceptions and lambdas”

我收到了很多关于文章 Checked exceptions and lambdas 的有趣反馈。
先从我自己的说起:写完那篇文章后,我意识到我之前已经写过一篇 类似的文章

我犯的错误

我把 Apache Commons Lang 3 和 Vavr 搞混了。
我使用了 recover() 函数,它属于 Vavr,而 Apache Commons Lang 只提供普通的工具方法。

Vavr 的 Try 类封装了会抛出受检异常的方法,并将 Java 与更函数式的风格桥接起来。

var foo = new Foo();
CheckedFunction1 throwingFunction = foo::throwing;

var result = List.of("One", "Two")
    .stream()
    .map(input ->
        Try.of(() -> throwingFunction.apply(input))
            .recover(IOException.class, e -> "")
            .getOrElse("")
    )
    .toList();

Vavr 的 API 相当庞大,但 Try 本身的表面相当易于理解:

Vavr’s Try class diagram

我忘记的事

在 Mastodon 上,Oliver Drotbohm 指出 Spring Framework 提供了自己的包装工具。

Spring logo
Oliver Drotbohm: “@frankel@mastodon.top 如果你恰好在构建基于 Spring 的应用程序,也有一些帮助器:https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/util/function/package-summary.html”

Spring utilities that wrap exceptions

我学到的内容

另一条反馈提到了 Result4J,这是我之前未曾听说过的库。

Result4J 提供了类似 Rust 的 Result 类型,可以表示成功的值或错误。虽然 Java 原生的错误报告方式是通过异常,但在函数式风格的代码中,纯函数预期不抛出异常时,Result 类型会非常方便。

  • Repository:
  • Maven artifact: io.github.sviperll:result4j

示例(摘自 README)

Catcher.ForFunctions io = Catcher.of(IOException.class).forFunctions();

String concatenation = Stream.of("a.txt", "b.txt", "c.txt")
    .map(io.catching(name -> loadResource(name)))
    .collect(ResultCollectors.toSingleResult(Collectors.join()))
    .orOnErrorThrow(Function.identity());

Result4J API overview

附加反馈

在 Bluesky 上,Donald Raab(Eclipse Collections 前设计师)分享了一篇关于 Eclipse Collections 如何处理已检查异常的帖子。

“感谢分享!几年前我写了关于 Eclipse Collections 中的异常处理 的博客。文中还有一篇来自 @brianvermeer.nl 的精彩博客链接。🙏”

您可以在此阅读该帖子:

— Donald Raab (@thedonraab.bsky.social) 2026‑01‑18 19:30 UTC

Conclusion

反馈总是很有价值。多亏了反馈,我意识到自己犯了错误,得到了指向 Spring 中相同特性的提示,并发现了 result4j。多年使用 Kotlin 编码,最近又使用 Rust,使我更加欣赏 Result 的做法。未来的项目中,我会评估将 result4j 用作 Vavr 的替代方案。

更进一步

最初发表于 A Java Geek 于2026年2月1日。

Back to Blog

相关文章

阅读更多 »

我的 Java 笔记:理解 String

在使用 Java 程序时,处理文本非常常见——存储名称、消息或用户输入。在 Java 中,文本是通过 String 类来处理的。什么是…

Java 笔记

在终端(Terminal)中使用 bash 运行 Java,命令为 `javac App.java && java App`。`javac` 将 Java 源文件 App.java 编译成字节码 App.class。`&&` 运算符在前一个命令成功后执行第二个命令。

Spring Boot 异常处理

Java 与 Spring Boot 异常处理笔记 1. 什么是 Exception? Exception = 打破程序正常流程的不期望情况。 异常处理的目标……