Как назначить лямбда-выражение переменной? - PullRequest
0 голосов
/ 14 сентября 2018

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

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;
    }

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

Ответы [ 3 ]

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

Вы можете создать карту со строкой, и 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);
0 голосов
/ 14 сентября 2018

из примера не очень понятно, каким должно быть 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));
0 голосов
/ 14 сентября 2018

Например:

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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...