Като разработчик на 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)
(но се надяваме, че е по-добре наречен) е пропуснат, бих бил любопитен да чуя обосновката.