我在构造函数中有lambda这样的枚举
enum class EventType(
val getInfoBlocks: (Book, AuditEntity?) -> List<InfoBlock>? = { _, _ -> emptyList() }
) {...}
现在我像这样使用此lambda函数:
data = it.getInfoBlocks.invoke(deal, null)
我可以不使用null吗?有没有办法为空lambda函数参数设置默认值?
答案 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()