Попробуйте этот странный трюк:
g = oa -> Math.max(0, f.apply(oa.map(a -> a)));
// ^----------^
Сопоставление типа необязательного, как это, позволяет компилятору «отличать» тип необязательного до согласованного типа.
Это имеет недостаток в создании нового экземпляра Optional
.
Но, конечно, я задал этот вопрос , который размышляет, действительно ли это то, что должно быть разрешено спецификацией или ошибкой.
Лично я не считаю ваше «лучшее до сих пор» особенно вопиющим. Конечно, это зависит от того, как выглядит реальный код.