gpt4 book ai didi

Java:用 lambda 替换 switch。值得?

转载 作者:塔克拉玛干 更新时间:2023-11-01 23:01:51 27 4
gpt4 key购买 nike

在检查事件时,使用带有 switch 或 if 的代码块是很常见的事情。如果变得简单,它可以是干净的代码,但似乎仍然有比需要更多的行,并且可以使用 lambda 进行简化。

用 if 阻止:

if(action == ACTION_1){
doAction1();
} else if(action == ACTION_2){
doAction2();
} else {
doDefaultAction();
}

带开关的 block :

switch(action){
case ACTION_1:
doAction1();
break;
case ACTION_2:
doAction2();
break;
default:
doDefaultAction();
}

使用下面的实用程序类 With 使用 lambda 进行阻止:

with(action)
.when(ACTION_1, this::doAction1)
.when(ACTION_2, this::doAction2)
.byDefault(this::doDefaultAction)

使用 lambda 的代码更少,但问题是:它比其他的更容易阅读吗?更容易维护?关于性能 lambdas 是最差的,但对于性能不重要的情况,lambdas 版本比 switch/if block 短。

那么,你怎么看呢?也许有比这更短的 Kotlin 方式,我尝试只专注于 Java,我喜欢 Kotlin,但编译对于我的项目来说仍然太慢。

当 block 必须返回特定值时,可以使用类似的实用程序类。

仅供引用,lambda 的类在这里,我没有检查错误,只是为了这个例子快速完成:

public class With<T> {

private final T id;
private boolean actionFound;

private With(T id) {
this.id = id;
}

public static <T> With<T> with(T id) {
return new With<>(id);
}

public With<T> when(T expectedId, Action action) {
if (!actionFound && id == expectedId) {
actionFound = true;
action.execute();
}
return this;
}

public void byDefault(Action action) {
if (!actionFound) {
action.execute();
}
}

@FunctionalInterface
interface Action {
void execute();
}
}

最佳答案

正如一对夫妇所说,用复合方法替换 switch 效率较低。根据您的用例,使用您的实现甚至可能是值得的。

有趣的是,Oracle 实际上计划在 switch 语句中实现 lambda,如 this recent JEP 中所示。 .

例子:

String formatted = switch (s) {
case null -> "(null)";
case "" -> "(empty)";
default -> s;
}

关于Java:用 lambda 替换 switch。值得?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48585248/

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