正如你们中许多人所知道的那样,有一个经典的Operation
枚举的例子(现在使用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的首选方式,Lambda方式是否是首选方式?
public static final DoubleBinaryOperator PLUS = (l, r) -> l + r;
? - Andrejssymbol
,它允许创建映射。这很顺畅,因为您可以免费获得“迭代所有常量”的逻辑。 - Holger