我不明白,为什么下面的编译:
directory.listFiles { it -> it.name.startsWith("abc") }
但这不是
directory.listFiles { it.name.startsWith("abc") }
在第一个例子中,it的类型是通过name属性推断出来的,我的假设是否正确?为什么在第二个例子中没有发生这种情况?
it
name
falq053o1#
这是因为有两种可能的FunctionalInterfaces可以与File.listFiles一起使用:
FunctionalInterfaces
File.listFiles
listFiles(FileFilter)
accept(File pathname)
listFiles(FilenameFilter)
accept(File dir, String name)
it ->
SOMETHING ->
FileFilter
FilenameFilter
directory.listFiles { dir, name -> name.startsWith("abc") }
这里的神奇之处不在于it--这是一个巧合,而在于您只声明了一个参数。
1条答案
按热度按时间falq053o1#
这是因为有两种可能的
FunctionalInterfaces
可以与File.listFiles
一起使用:listFiles(FileFilter)
-此接口为accept(File pathname)
listFiles(FilenameFilter)
-此接口为accept(File dir, String name)
编译器无法计算出您要使用哪一个,那么在您编写
it ->
的情况下,这有什么更好的呢?编译器检查两个接口方法的调用参数,现在可以看到您需要一个参数“
SOMETHING ->
”,因此唯一匹配的调用是FileFilter
变体。如何使用
FilenameFilter
?您可以使用以下语法:这里的神奇之处不在于
it
--这是一个巧合,而在于您只声明了一个参数。