Как разработчик Scala, который также работает в GWT
, я приветствую добавление Optional
в Guava.
Один из наших наиболее распространенных случаев использования Optional
— это возврат необязательных значений из методов (как предлагается в ответе на В чем смысл необязательного класса Guava.
В 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)
(но, надеюсь, с более подходящим названием) был опущен, мне было бы любопытно услышать его обоснование.