6

作为一名同时在 Scala 中工作的开发人员GWT,我欢迎加入OptionalGuava。

我们最常见的用例之一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)省略了(但希望命名更好)之类的方法,我很想知道其中的原因。

4

1 回答 1

7

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

也就是说,另一种选择是

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

请注意,asSet这里是必要的 -Optional非常刻意地不自己实现Iterable

于 2012-12-08T02:05:36.017 回答