Enum实现lambda可能接口的简写表示法

Ste*_* K. 4 java lambda enums enumeration java-8

来自jparsec的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;
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

哪里

public interface Map2<A, B, T> {

  /** Maps {@code a} and {@code b} to the target object. */
  T map(A a, B b);
}
Run Code Online (Sandbox Code Playgroud)

一个简单的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);
    }
}
Run Code Online (Sandbox Code Playgroud)

Tun*_*aki 7

适当的界面将在DoubleBinaryOperator这里.当您需要操作两个double值并返回a 时,此接口适用double.它适用于原语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);
    }

}
Run Code Online (Sandbox Code Playgroud)

实现DoubleBinaryOperator接口可以证明是有用的:这样你可以直接使用枚举值DoubleBinaryOperator,如:

DoubleStream.of(1, 2, 3).reduce(0, BinaryOperator.PLUS);
Run Code Online (Sandbox Code Playgroud)

(这只是一个例子;有更好的方法来执行此特定实例.)