Java8 FP если / else if / else заменить на лямбды - PullRequest
0 голосов
/ 15 сентября 2018

У меня проблема с операторами Java 8 if.Может кто-нибудь показать мне способ написания этого кода без использования только лямбды Java 8?Решение не должно иметь, если, пока или для.Это вообще возможно?

if (first_number == second_number) {
  return "PERFECT";
} else if (first_number > second_number) {
  return "ABUNDANT";
} else {
  return "DEFICIENT";
}

Ответы [ 2 ]

0 голосов
/ 15 сентября 2018

Как насчет этого решения с лямбдами? Я предполагаю целочисленные значения, но не должно быть слишком сложно переключиться на 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();
0 голосов
/ 15 сентября 2018

Нет «если», «время» или «для», но лямбды также нет:

return (first_number == second_number ? "PERFECT" :
        first_number > second_number ? "ABUNDANT" : "DEFICIENT");

? : называется условным оператором в спецификации языка Java (см. 15.25. Условный оператор ? :), но обычно известен как троичный символ оператор , так как это единственный оператор в Java из 3 частей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...