Как насчет этого решения с лямбдами? Я предполагаю целочисленные значения, но не должно быть слишком сложно переключиться на float или double.
int first_number = 10;
int second_number = 20;
IntBinaryOperator subtract = (n1, n2) -> n1 - n2; // Subtract second from first value
IntUnaryOperator determineSign = n -> Integer.signum(n); // Determine the sign of the subtraction
IntFunction<String> message = key -> { // Sign of 0 means value has been 0 (first_number == second_number). Sign of 1 = positive value, hence equals first_number > second_number, otherwise return the default.
Map<Integer, String> messages = new HashMap<>();
messages.put(0, "PERFECT");
messages.put(1, "ABUNDANT");
return messages.getOrDefault(key, "DEFICIENT");
};
return message.apply(determineSign.applyAsInt(subtract.applyAsInt(first_number, second_number)));
Редактировать: Андреас упомянул действительные проблемы, я согласен, вы бы так не поступили. Но я думаю больше о том, чтобы доказать, что это возможно, используя лямбды. :) Другой метод (ab) с использованием Необязательно:
int first_number = 20;
int second_number = 20;
Optional<Integer> dummy = Optional.of(0); // Dummy allowing to call filter on the Optional
Predicate<Integer>isAbundant = i -> first_number > second_number; // Check if input is abundant
Predicate<Integer> isPerfect = i -> first_number == second_number; // Check if input is perfect
Supplier<String> other = () -> dummy.filter(isAbundant).map(i -> "ABUNDANT").orElse("DEFICIENT"); // Fallback, if input is not perfect. Check for abundant or return default
Supplier<String> validate = () -> dummy.filter(isPerfect).map(i -> "PERFECT").orElse(other.get()); // Check if input is perfect or use fallback
return validate.get();