【发布时间】:2012-11-26 05:51:09
【问题描述】:
作为同时在 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 的 Option 似乎不允许任何比这样更优雅的东西:
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)(但希望命名更好)这样的方法被省略了,我很想知道其中的原因。
【问题讨论】: