gpt4 book ai didi

java - 经典操作枚举示例中的 Lambda

转载 作者:IT老高 更新时间:2023-10-28 21:00:42 24 4
gpt4 key购买 nike

你们中的许多人可能都知道,有一个 Operation 枚举的经典示例(虽然现在使用 Java 8 标准接口(interface)),如下所示:

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)));

它提供:

Performing operation + on 2 and 4: 6.0
Performing operation - on 2 and 4: -2.0
Performing operation * on 2 and 4: 8.0
Performing operation / on 2 and 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 方式是首选方式吗?

最佳答案

显然,lambda 版本更具可读性。它不仅更短,而且让读者在构造函数中一眼就能看到实现运算符。假设您想扩展 enum 以支持 int 计算......

从性能的角度来看,您正在通过生成的 lambda 类交换匿名 enum 内部类。 lambda 版本增加了另一个级别的委托(delegate),但这对 HotSpot 优化器没有挑战。执行性能方面不太可能有任何差异。

然而,当应用 lambda 模式时,您可能会获得使用该类的应用程序启动的加速。原因是对于传统的专用 enum 方法,Java 编译器必须为每种情况生成一个内部类,该内部类驻留在文件系统中或(可能是 zip 压缩的)Jar 文件中。动态生成 lambda 类(具有非常简单的结构)的字节码通常比加载类要快。对生成的 lambda 类不进行访问检查也可能会有所帮助。

总结一下:

  • lambda 方法更易于阅读,其代码更易于维护(重点)
  • 执行性能大致相同
  • lambda 方法的启动时间可能会更短

所以这对 lambda 来说是一个巨大的胜利。是的,我认为 lambda 方式是 Java 8 的首选方式。

关于java - 经典操作枚举示例中的 Lambda,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23361418/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com