How about using suppliers when you want to avoid evaluating some expensive method?
Like this:
public static <T> T coalesce(Supplier<T>... items) {
for (Supplier<T> item : items) {
T value = item.get();
if (value != null) {
return value;
}
return null;
}
And then using it like this:
Double amount = coalesce(order::firstAmount, order::secondAmount, order::thirdAmount)
You can also use overloaded methods for the calls with two, three or four arguments.
In addition, you could also use streams with something like this:
public static <T> T coalesce2(Supplier<T>... s) {
return Arrays.stream(s).map(Supplier::get).filter(Objects::nonNull).findFirst().orElse(null);
}