java - Enum 实现 lambda 可能接口(interface)的简写符号

标签 java lambda enums java-8 enumeration

看到来自 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/

相关文章:

java - 用 xpath 替换对象列表中的值?

java - 在 Java 8 Lambda-Stream 中使用字符串数组作为值并使用 Enum 作为键创建 Hashmap

linq-to-entities - IQueryable Lambda 投影语法

java - 从 lambda 表达式排序和子列表

java - Spring Boot 2.0 中的 EmbeddedServletContainerCustomizer

Java 8 流 IllegalStateException

java - 为单个术语和复合术语创建搜索过滤器的最有效方法是什么?

generics - 使用生命周期参数的结果-将生命周期参数的枚举应用于默认T <'a> and E<' a>参数(Rust)

enums - 是否可以在 ABAP 中创建枚举(枚举)?

java - 如何强制正在读取行的 while 循环在 3 个空行之前不停止?