Eu tenho trabalhado com o novo tipo opcional no Java 8 e me deparei com o que parece ser uma operação comum sem suporte funcional: um "ouElseOptional"
Considere o seguinte padrão:
Optional<Result> resultFromServiceA = serviceA(args);
if (resultFromServiceA.isPresent) return result;
else {
Optional<Result> resultFromServiceB = serviceB(args);
if (resultFromServiceB.isPresent) return resultFromServiceB;
else return serviceC(args);
}
Existem muitas formas desse padrão, mas tudo se resume a querer um "orElse" em um opcional que assume uma função que produz um novo opcional, chamado apenas se o atual não existir.
Sua implementação ficaria assim:
public Optional<T> orElse(Supplier<Optional<? extends T>> otherSupplier) {
return value != null ? this : other.get();
}
Estou curioso para saber se existe um motivo para que esse método não exista, se estou apenas usando o Opcional de maneira não intencional e de que outras maneiras as pessoas inventaram para lidar com esse caso.
Devo dizer que acho que as soluções que envolvem classes / métodos de utilitários personalizados não são elegantes porque as pessoas que trabalham com meu código não necessariamente sabem que elas existem.
Além disso, se alguém souber, esse método será incluído no JDK 9, e onde devo propor esse método? Isso parece uma omissão bastante flagrante para a API para mim.
orElseGet()
que o OP precisa, mas não gera uma sintaxe em cascata agradável.