Which solution is better? Using a nullable lambda or passing an empty lambda as a default parameter? Would kotlin somehow optimize empty lambda, or create a new instance that does nothing?

class Test1(val action: () -> Unit = {})

Unfortunately, I do not understand generated byte code. Let's analyze

val test11 = Test1()

反编译后,我们得到:

private static final Test1 test11 = new Test1((Function0)null, 1, (DefaultConstructorMarker)null);

And finally, as a lambda is passed, something like this:

var1 = (Function0)null.INSTANCE;

编辑:

推荐答案

将空lambda作为lambda参数的默认值传递肯定比传递null更惯用.

IntelliJ IDEA中使用的反编译器并不总是能很好地处理Kotlin字节码,因此在本例中,您在其输出中看到的并不反映实际发生的情况.实际上,空的lambda将被编译成一个单例嵌套类,用一个空的主体实现相应的FunctionN接口,单例实例将被用作默认值.

See my talk slides for more information on how default parameters are implemented in Kotlin.

Kotlin相关问答推荐

在Kotlin Jetpack中重用下拉菜单

Kotlin和JavaFX:绑定行为奇怪

如何在Kotlin中为接受varargs的函数添加带有默认值的新参数?

如果启用了Flyway迁移,则不能具有配置属性';datources.default.架构-生成

无法访问类kotlin.coroutines.CoroutineContext';.判断模块类路径中是否存在丢失或冲突的依赖项

多模块Kotlin项目中的FreeFair

如何在Docker中使用Selenium和chromedriver?

为什么 <= 可以应用于 Int 和 Long,而 == 不能?

如何在 Jetpack Compose 中启动和停止动画

如何规避 Kotlin 的泛型类型差异约束

匹配在单词边界上包含特殊字符的变量字符串的正则表达式

如何有效地填充 Gradle Kotlin DSL 中的额外属性?

判断 AAR 元数据值时发现的一个或多个问题:

无法从 XML 访问 NavHostFragment

API 'variant.getJavaCompile()' 已过时

在 Koin 中提供一个 Instance 作为其接口

Firestore - 如何在 Kotlin 中排除数据类对象的字段

Jetpack Compose 折叠工具栏

如何在Kotlin中将字符串转换为InputStream?

如何在伴随对象中使用泛型