java - 在单个表达式中解包 Guava Optional

标签 java guava

作为也在 GWT 工作的 Scala 开发人员,欢迎补充Optional Guava 。

我们最常见的用例之一 Optional是从方法返回可选值时(如 What's the point of Guava's Optional class 的答案所建议的那样。

在scala中,我经常这样写代码:

def someExpensiveOperation(params: Type): Option[ResultType] = ...
someExpensiveOperation(params).foreach({ val =>
  doSomethingWithVal (val)
})

Guava 的选项似乎不允许任何比这样更优雅的东西:

Optional<MyType> optionalResponse = someExpensiveOperation(params);
if (optionalResponse.isPresent()) {
    doSomethingWithVal(optionalResponse.get())
}

局部变量是冗余的,它需要重复一个可以抽象的模式(if (optional.isPresent()) { doSomethingWith(optional.get()) })。

另一种选择是调用返回 Optional 的方法两次:

if (someExpensiveOperation(params).isPresent()) {
    doSomethingWithVal(someExpensiveOperation(params).get())
}

但这显然是不可取的,因为它不必要地多次调用昂贵的操作。

我很好奇其他人是如何处理这种非常常见的情况的(也许是通过编写像 <T>useIfPresent(Optional<T> val, Closure<? super T> closure) 这样的静态实用方法?)或者是否有人找到了更优雅的解决方案。

此外,如果有人知道为什么像 Optional.foreach(Closure<? super T> closure) 这样的方法(但希望更好的命名)被省略了,我很想听听理由。

最佳答案

它不存在是因为我们觉得编写闭包的匿名类尴尬更尴尬且可读性更差——至少在 Java 中,不一定在 Scala 中——比你已经编写的局部变量和 if 语句.

也就是说,另一种选择是

for (Foo x : someExpensiveOperation().asSet()) {
  // do stuff with x
}

请注意,asSet 在这里是必需的 -- Optional 非常有意地本身不实现 Iterable

关于java - 在单个表达式中解包 Guava Optional,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13773463/

相关文章:

java:统一处理子类

java - 与 Java 11 兼容的最低 Spring 版本

java - 来自 JSP 的每个 servlet 请求都会创建新 session 吗?

java - 将 Char 转换为 double

java - Weblogic 服务器 Guava NoSuchMethodError

java - Chunkwise-将数据从InputStream复制到OutputStream + 在末尾获取byte[]

java - 用于识别各种 Java API 中的 Java 注释的工具

java - 向 Guava ImmutableList 添加和删除项目

java - 是否有可能有一个基于 Gson 的方法来反序列化具有不同类的值的映射?

java - 构建Apache Beam Cassandra JAR时没有重新打包的依赖项