作为一名同时在 Scala 中工作的开发人员GWT
,我欢迎加入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)
})
番石榴的 Option 似乎不允许任何比这样更优雅的东西:
Optional<MyType> optionalResponse = someExpensiveOperation(params);
if (optionalResponse.isPresent()) {
doSomethingWithVal(optionalResponse.get())
}
局部变量是多余的,它需要重复一个可以抽象的模式(the 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)
省略了(但希望命名更好)之类的方法,我很想知道其中的原因。