Ho lavorato con il nuovo tipo opzionale in Java 8 e ho riscontrato quella che sembra un'operazione comune che non è supportata funzionalmente: un "orElseOptional"
Considera il seguente modello:
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);
}
Esistono molte forme di questo modello, ma si riduce a desiderare un "orElse" su un opzionale che accetta una funzione producendo un nuovo opzionale, chiamato solo se quello attuale non esiste.
La sua implementazione sarebbe simile a questa:
public Optional<T> orElse(Supplier<Optional<? extends T>> otherSupplier) {
return value != null ? this : other.get();
}
Sono curioso di sapere se esiste un motivo per cui un tale metodo non esiste, se sto semplicemente usando Opzionale in modo non intenzionale e quali altri modi sono stati inventati per affrontare questo caso.
Dovrei dire che penso che le soluzioni che coinvolgono classi / metodi di utilità personalizzati non siano eleganti perché le persone che lavorano con il mio codice non sapranno necessariamente che esistono.
Inoltre, se qualcuno lo sa, un tale metodo sarà incluso in JDK 9 e dove potrei proporlo? Mi sembra un'omissione piuttosto evidente all'API.
orElseGet()
ciò di cui ha bisogno OP, solo che non genera una bella sintassi a cascata.