Как использовать в лямбда-выражении Predicate вместе с BinaryOperation
Есть код с записанным предикатом predicate и бинарной операцией sum. Как можно вывести результат бинарной операции с помощью лямбда-выражения при условии true в бинарной операции (вместо обычной конструкции с if). Заранее спасибо.
public static void main(String[] args) {
String arr[] = {"2.8", "+", "7.3"};
Predicate<String> predicate = p -> p.equals("+");
BinaryOperator<Double> sum = (value1, value2) -> value1 + value2;
if (predicate.test(arr[1])) {
System.out.println(sum.apply(Double.valueOf(arr[0]), Double.valueOf(arr[2])));
}
}
Ответы (1 шт):
Автор решения: Miron
→ Ссылка
Сразу замечу, что нам, в таком случае, придется принимать в качестве аргумента arr[1]. Поэтому придется создавать свой функциональный интерфейс(с аргументами Y T T, для гибкости. Передаем в Y arr[1], в T-шки Double значения):
@FunctionalInterface
static interface TrinaryOperator<V, T>{
T getResult(V v, T t1, T t2);
}
В коде можно сделать так:
TrinaryOperator<String, Double> sum = (symbol, value1, value2) -> {if(predicate.test(symbol)){return value1 + value2;} else {throw new IllegalArgumentException();}};
try{
System.out.println(sum.getResult(arr[1], Double.valueOf(arr[0]), Double.valueOf(arr[2])));
} catch (IllegalArgumentException e){}
А можно сделать так:
static Predicate<String> predicate = p -> p.equals("+");
...
TrinaryOperator<String, Double> sum = SO::getSummOfThem;
try{
System.out.println(sum.getResult(arr[1], Double.valueOf(arr[0]), Double.valueOf(arr[2])));
} catch (IllegalArgumentException e){}
...
static Double getSummOfThem(String symbol, Double value1, Double value2){
if(predicate.test(symbol)){
return value1 + value2;
}
throw new IllegalArgumentException();
}