关于受检异常和 lambda 表达式的反馈
Source: Dev.to

我收到了很多关于文章 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 本身的表面相当易于理解:
我忘记的事
在 Mastodon 上,Oliver Drotbohm 指出 Spring Framework 提供了自己的包装工具。
Oliver Drotbohm: “@frankel@mastodon.top 如果你恰好在构建基于 Spring 的应用程序,也有一些帮助器:https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/util/function/package-summary.html”

我学到的内容
另一条反馈提到了 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());

附加反馈
在 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日。
