Как многие из вас могут знать, есть классический пример Operation
enum (теперь с использованием стандартного интерфейса Java 8), то есть следующее:
enum Operation implements DoubleBinaryOperator {
PLUS("+") {
@Override
public double applyAsDouble(final double left, final double right) {
return left + right;
}
},
MINUS("-") {
@Override
public double applyAsDouble(final double left, final double right) {
return left - right;
}
},
MULTIPLY("*") {
@Override
public double applyAsDouble(final double left, final double right) {
return left * right;
}
},
DIVIDE("/") {
@Override
public double applyAsDouble(final double left, final double right) {
return left / right;
}
};
private final String symbol;
private Operation(final String symbol) {
this.symbol = symbol;
}
public String getSymbol() {
return symbol;
}
}
Протестировано с помощью
Arrays.stream(Operation.values())
.forEach(op -> System.out.println("Performing operation " + op.getSymbol() + " on 2 and 4: " + op.applyAsDouble(2, 4)));
Он обеспечивает:
Выполнение операции + на 2 и 4: 6,0
Выполнение операции - на 2 и 4: -2,0
Выполнение операции * по 2 и 4: 8,0
Выполнение операции/по 2 и 4: 0,5
Но я чувствую, что мы можем сделать лучше с Java 8, поэтому я реализовал следующее:
enum Operation implements DoubleBinaryOperator {
PLUS ("+", (l, r) -> l + r),
MINUS ("-", (l, r) -> l - r),
MULTIPLY("*", (l, r) -> l * r),
DIVIDE ("/", (l, r) -> l / r);
private final String symbol;
private final DoubleBinaryOperator binaryOperator;
private Operation(final String symbol, final DoubleBinaryOperator binaryOperator) {
this.symbol = symbol;
this.binaryOperator = binaryOperator;
}
public String getSymbol() {
return symbol;
}
@Override
public double applyAsDouble(final double left, final double right) {
return binaryOperator.applyAsDouble(left, right);
}
}
Функционально это эквивалентно, однако обе реализации все еще похожи, или есть некоторые скрытые детали, которые делают новую версию хуже старой версии?
И, наконец, лямбда-путь предпочтительный способ сделать это с Java 8?