看到来自 jparsec 的 Java 8 之前的示例,我想知道我是否可以利用 lambda 来获得更具表现力的语法。
原始示例:
enum BinaryOperator implements Map2<Double,Double,Double> {
PLUS {
public Double map(Double a, Double b) {
return a + b;
}
},
MINUS {
public Double map(Double a, Double b) {
return a - b;
}
},
MUL {
public Double map(Double a, Double b) {
return a * b;
}
},
DIV {
public Double map(Double a, Double b) {
return a / b;
}
}
}
在哪里
public interface Map2<A, B, T> {
/** Maps {@code a} and {@code b} to the target object. */
T map(A a, B b);
}
一个简单的 Map2 实例可以很容易地创建,例如(a,b)->a+b
,但是对于实现单个函数接口(interface)的枚举,是否有一种简洁的方法可以做到这一点?
我目前的解决方案看起来像这样,但它仍然很冗长:
enum BinaryOperator implements Map2<Double,Double,Double> {
PLUS((a, b) -> a + b), MINUS((a, b) -> a - b), MUL((a, b) -> a * b), DIV((a, b) -> a / b);
private final BiFunction<Double, Double, Double> f;
private BinaryOperator(BiFunction<Double, Double, Double> f) {
this.f = f;
}
@Override
public Double map(Double a, Double b) {
return f.apply(a, b);
}
}
最佳答案
合适的接口(interface)应该是DoubleBinaryOperator
这里。当您需要对两个 double
值进行操作并返回一个 double
时,此接口(interface)非常适合。它适用于原始 double
而不是包装类,因此它没有装箱开销。
您当前的解决方案仍然可行。代码被清楚地分解并且没有重复。通过以上界面,您可以:
enum BinaryOperator implements DoubleBinaryOperator {
PLUS((a, b) -> a + b),
MINUS((a, b) -> a - b),
MUL((a, b) -> a * b),
DIV((a, b) -> a / b);
private final DoubleBinaryOperator f;
private BinaryOperator(DoubleBinaryOperator f) {
this.f = f;
}
@Override
public double applyAsDouble(double a, double b) {
return f.applyAsDouble(a, b);
}
}
实现 DoubleBinaryOperator
接口(interface)可以证明是有用的:这样您可以直接将枚举值用作 DoubleBinaryOperator
,例如:
DoubleStream.of(1, 2, 3).reduce(0, BinaryOperator.PLUS);
(这只是一个例子;有更好的方法来完成这个特定的例子。)
关于java - Enum 实现 lambda 可能接口(interface)的简写符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35750883/