Kotlin抱怨尽管lambda匹配了签名,但类型不正确
我有一些代码,根据IntelliJ的检查,它期望(可变)列表中的Kotlin抱怨尽管lambda匹配了签名,但类型不正确,kotlin,lambda,Kotlin,Lambda,我有一些代码,根据IntelliJ的检查,它期望(可变)列表中的函数,但提供了(列表)->Int。据我所知,后者是前者的有效签名 有关守则: val longest = HashMap<String, List<String>>() .apply { this["aal"] = listOf("ala", "aal", "laa")
函数<!,out Int!>代码>,但提供了(列表)->Int
。据我所知,后者是前者的有效签名
有关守则:
val longest = HashMap<String, List<String>>()
.apply {
this["aal"] = listOf("ala", "aal", "laa")
this["eilv"] = listOf("evil", "live")
this["aaa"] = listOf("aaa", "aaa", "aaa")
}
.values
.stream()
.collect(groupingBy({ list: List<String> -> list.size },
Supplier { TreeMap<Int, List<List<String>>>() },
toList()))
.lastEntry()
.value
但是,当我更改此选项时:
.collect(groupingBy({ list: List<String> -> list.size },
Supplier { TreeMap<Int, List<List<String>>>() },
toList()))
.collect(分组依据({list:list->list.size}),
供应商{TreeMap()},
toList())
为此:
.collect(groupingBy({ list: List<String> -> list.size },
{ TreeMap<Int, List<List<String>>>() },
toList()))
.collect(分组依据({list:list->list.size}),
{TreeMap()},
toList())
解决了这个问题。为什么呢?为什么指定Supplier
名称会以错误消息抱怨映射功能的方式改变行为?这是Kotlin当前提供的实现细节:它看到groupingBy
有两个SAM类型的参数(函数
和供应商
)并创建一个合成方法,用Kotlin函数类型替换它们。因此,您只能传递两个Kotlin函数(如上一个示例所示)或一个函数
和一个供应商
:
.collect(groupingBy(Function { list: List<String> -> list.size },
Supplier { TreeMap<Int, List<List<String>>>() },
toList()))
.collect(分组依据(函数{list:list->list.size}),
供应商{TreeMap()},
toList())
(可能需要导入java.util.function.function
并可能指定类型参数)
.collect(groupingBy(Function { list: List<String> -> list.size },
Supplier { TreeMap<Int, List<List<String>>>() },
toList()))