Я працював з новим додатковим типом в Java 8 , і я натрапив на те, що схоже на звичайну операцію, яка не підтримується функціонально: "orElseOptions"
Розглянемо таку схему:
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);
}
Існує багато форм цього шаблону, але він зводиться до того, щоб бажати "orElse" на необов'язковій формі, яка приймає функцію, що створює новий необов'язковий, іменується лише якщо поточного не існує.
Її реалізація виглядатиме так:
public Optional<T> orElse(Supplier<Optional<? extends T>> otherSupplier) {
return value != null ? this : other.get();
}
Мені цікаво, чи є причина, що такий метод не існує, якщо я просто недбало використовую необов’язковий і які інші способи люди придумали для вирішення цієї справи.
Слід сказати, що я думаю, що рішення, що включають власні класи / методи корисних програм, не є витонченими, оскільки люди, які працюють з моїм кодом, не обов'язково знають, що вони існують.
Крім того, якщо хтось знає, чи буде такий метод включений до JDK 9, і де я можу запропонувати такий метод? Це здається мені досить кричущим упущенням API.
orElseGet()
те, для чого потрібна ОП, тільки вона не створює приємного каскадного синтаксису.