У меня есть своего рода калькулятор:
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;
}
Но это не работает. Ребята, вы можете помочь? Спасибо
Помимо всего прочего, смысл использования полиморфизма заключается в использовании Map<String,something> вместо этих операторов if.
Что вы имеете в виду под вопросом дизайна @Nikolas?




Например:
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);
намного чище было бы определить перечисление для этого
Да, вы можете улучшить решение, используя перечисления. Это всего лишь базовый пример, но перечисление очень хорошо подходит для варианта использования, и операция get должна обрабатывать неизвестные операции.
Почему лямбда в конце? что это за лямбда с 3 аргументами?
Для замены последней указанной лямбды.
Вы можете создать карту со строкой и 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));
Это не проблема лямбда, а проблема дизайна.