【发布时间】:2016-03-02 15:04:07
【问题描述】:
看到一个来自 jparsec 的 pre-Java 8 示例,我想知道是否可以利用 lambdas 来获得更具表现力的语法。
原例:
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,但是对于实现单个函数接口的枚举,是否有一种简洁的方法可以做到这一点?
我当前的解决方案看起来像这样,但它仍然很冗长:
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);
}
}
【问题讨论】:
-
我不认为你能比你目前的解决方案更好。枚举常量之间的差异只能通过两种方式表达:实现方法或传递构造函数参数。第一个是我们想要离开的那个,所以构造函数参数是我们唯一的选择。构造函数参数必须放在一个字段中。枚举还必须实现
map(),我们已经找到了您的解决方案。 -
我看到八行常量样板代码和每个常量的代码量一样短,例如
PLUS((a, b) -> a + b),。你想简洁多少?相关:“Lambdas in the classical Operation enum example”
标签: java lambda enums java-8 enumeration