Как использовать в лямбда-выражении 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();
}
→ Ссылка