Kotlin中lambda函数的参数的默认值

时间:2020-06-23 10:19:29

标签: kotlin lambda

我在构造函数中有lambda这样的枚举

enum class EventType(
    val getInfoBlocks: (Book, AuditEntity?) -> List<InfoBlock>? = { _, _ -> emptyList() }
) {...}

现在我像这样使用此lambda函数:

data = it.getInfoBlocks.invoke(deal, null)

我可以不使用null吗?有没有办法为空lambda函数参数设置默认值?

2 个答案:

答案 0 :(得分:3)

TL; DR :函数类型不能与它们关联的默认参数值。
这是只有命名(非匿名)函数才能执行的操作。

但是,可能有一个更好的解决方案。


否,不允许匿名函数(即lambda表达式和fun块)为其参数指定默认值。

但是,您提出的建议甚至比这更复杂:您似乎希望默认值与该函数的 type 相关联,因此无论分配哪个函数,它都将保持不变此属性。

因为此默认值取决于函数已分配给的变量的类型,为此,类型系统将需要一种方法来将默认参数值存储在函数的类型信息中(例如(Book, AuditEntity? = null) -> List<InfoBlock>?之类的东西),无法做到这一点。


但是,鉴于这是一个枚举,因此无需将匿名函数存储为属性;只需声明一个虚函数并在必要时覆盖它即可:

enum class EventType {

    // Type1 has the default implementation
    Type1,
    
    // Type2 has its own implementation
    Type2 {
        override fun getInfoBlocks(book: Book, entity: AuditEntity?): List<InfoBlock>? {
            // Do something else
            return foo()
        }
    };
    
    // Default implementation
    open fun getInfoBlocks(book: Book, entity: AuditEntity? = null): List<InfoBlock>? {
        return emptyList()
    }

}

(请注意,分号是必需的,以终止常量列表。)


相似(但不相同)是为什么无法在匿名函数本身(see also this question)中指定默认参数,即:

{ a: Any, b: Any? = null -> foo() }

即使不可能做到这一点,也没有办法为整个函数系列指定默认参数。

答案 1 :(得分:0)

是的,不要使用lambda而是将其设为普通函数:)

fun getInfoBlocks (x: Book, y: AuditEntity? = null) : List<InfoBlock>  = emptyList()