Как присвоить переменной лямбда-выражение?

У меня есть своего рода калькулятор:

sum = value1 + value2;
    multiplication = value1 * value2;
    division = (value1 / value2);
    average = (sum / 2);

    if (operation.compareToIgnoreCase("add") == 0)
        result = sum;
    else if (operation.compareToIgnoreCase("mult") == 0)
        result = multiplication;
    else if (operation.compareToIgnoreCase("div") == 0)
        result = division;
    else if (operation.compareToIgnoreCase("avg") == 0)
        result = average;

И мне нужно превратить это в лямбда-выражения:

result = (request.getValue1(), request.getValue2()) -> {
        if (request.getOperation().compareToIgnoreCase("add") == 0) return request.getValue1() + request.getValue2();
        else if (request.getOperation().compareToIgnoreCase("mult") == 0) return request.getValue1() * request.getValue2();
        else if (request.getOperation().compareToIgnoreCase("div") == 0) return request.getValue1() / request.getValue2();
        else if (request.getOperation().compareToIgnoreCase("avg") == 0) return (request.getValue1() + request.getValue2())/2;
    }

Но это не работает. Ребята, вы можете помочь? Спасибо

Это не проблема лямбда, а проблема дизайна.

Nikolas Charalambidis 14.09.2018 14:57

Помимо всего прочего, смысл использования полиморфизма заключается в использовании Map<String,something> вместо этих операторов if.

chrylis -cautiouslyoptimistic- 14.09.2018 15:03

Что вы имеете в виду под вопросом дизайна @Nikolas?

João Faria 17.09.2018 10:34
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
3
2 818
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Например:

BiFunction<Number,Number,Number> sum = (value1, value2) -> value1 + value2;

и вы можете использовать это так:

sum.apply(value1,value2)

еще примеры здесь.

Также вы можете хранить свой набор BiFunction в Map:

Map<String,BiFunction<Number, Number, Number>> operations = new HashMap<>();
operations.put("sum", sum);

Если вы сделаете то же самое для всех операций, вы вызовете их следующим образом:

operations.get("sum").apply(value1, value2);

Итак, результат можно вычислить следующим образом:

result = (value1, value2, operation) -> operations.get(operation).apply(value1, value2);

намного чище было бы определить перечисление для этого

Eugene 14.09.2018 15:13

Да, вы можете улучшить решение, используя перечисления. Это всего лишь базовый пример, но перечисление очень хорошо подходит для варианта использования, и операция get должна обрабатывать неизвестные операции.

Lorelorelore 14.09.2018 15:15

Почему лямбда в конце? что это за лямбда с 3 аргументами?

fps 14.09.2018 16:25

Для замены последней указанной лямбды.

Lorelorelore 14.09.2018 16:57

Вы можете создать карту со строкой и DoubleBinaryOperator или IntBinaryOperator в зависимости от типа, который вы хотите:

Map<String, DoubleBinaryOperator> map = new HashMap<>();
map.put("add", (v1, v2) -> v1 + v2);
map.put("mult", (v1, v2) -> v1 * v2);
map.put("div", (v1, v2) -> v1 / v2);
map.put("avg", (v1, v2) -> (v1 * v2) / 2);

Затем вы можете вызвать эту карту с нужной вам операцией, например:

// an example
String operation = "add";
Double reslt = map.get(operation).applyAsDouble(3, 5);

из примера не очень понятно, каким должен быть result. Так что позвольте мне переписать его, включая типы:

Function<Request, Double> calculator = (request) -> {
    if (request.getOperation().compareToIgnoreCase("add") == 0) return request.getValue1() + request.getValue2();
    else if (request.getOperation().compareToIgnoreCase("mult") == 0) return request.getValue1() * request.getValue2();
    else if (request.getOperation().compareToIgnoreCase("div") == 0) return request.getValue1() / request.getValue2();
    else if (request.getOperation().compareToIgnoreCase("avg") == 0) return (request.getValue1() + request.getValue2())/2;
    else throw new IllegalArgumentException();
};

double result = calculator.apply(new Request("add", 2, 4));

Другие вопросы по теме