作为也在 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/