Kotlin:如何将一个对象函数作为parameter passing给另一个?

我正在努力学习functionKotlin,并写下了这个测试代码:

import java.util.* data class BorrowerX(val name: String, val maxBooks: Int) { companion object { fun getName(br: BorrowerX): String = br.name fun findBorrowerX(n: String, brs: ArrayList): BorrowerX? { val coll: List = brs.filter { BorrowerX.getName(it) == n } if (coll.isEmpty()) { return null } else return coll.first() } fun findBorrowerX2(n: String, brs: ArrayList, f: (BorrowerX) -> String): BorrowerX? { val coll: List = brs.filter { f(it) == n } if (coll.isEmpty()) { return null } else return coll.first() } } } 

在REPL中,我可以成功地调用“findBorrowerX”:

 import BorrowerX val br1 = BorrowerX(name = "Borrower1", maxBooks = 1) val br2 = BorrowerX(name = "Borrower2", maxBooks = 2) val br3 = BorrowerX(name = "Borrower3", maxBooks = 3) val brs1 = arrayListOf(br1, br2, br3) BorrowerX.findBorrowerX("Borrower1", brs1) BorrowerX(name=Borrower1, maxBooks=1) BorrowerX.findBorrowerX("Borrower-Bad", brs1) null 

但是,如何打电话给“findBorrowerX2”:

 BorrowerX.findBorrowerX2("Borrower1", brs1, BorrowerX.getName(???)) 

并将迭代的BorrowerX传递给getName?

这看起来相关,但我不确定:

Kotlin:如何将一个函数作为parameter passing给另一个?

提前感谢您的帮助!

编辑:

这是我想要做的等效的Scala代码:

 def findBorrowerX2(n: String, brs: List[BorrowerX], f: BorrowerX => String): BorrowerX = { val coll: List[BorrowerX] = brs.filter(f(_) == n) if (coll.isEmpty) { null } else { coll.head } } scala> BorrowerX.findBorrowerX2("Borrower3", brs1, BorrowerX.getName(_)) res1: BorrowerX = BorrowerX(Borrower3,3) scala> BorrowerX.findBorrowerX2("Borrower33", brs1, BorrowerX.getName(_)) res2: BorrowerX = null 

也许这在科特林是不可能的?

您可以使用::运算符来获取函数引用:

 BorrowerX.findBorrowerX2("Borrower1", brs1, BorrowerX.Companion::getName) 

这里BorrowerX.Companion::getName是对BorrowerX类的伴随对象(名为Companion )中声明的函数getName的引用。 它具有typesKFunction1 ,它是所需function参数types(BorrowerX) -> String的子types。

值得注意的是,你也可以使用::运算符来获得属性引用:

 BorrowerX.findBorrowerX2("Borrower1", brs1, BorrowerX::name) 

BorrowerX::name的types为KProperty1 ,它也是(BorrowerX) -> String的子types。 当用指定的BorrowerX实例调用时,它将返回其name属性的值。

正如lambdas文档中所述 :

 BorrowerX.findBorrowerX2("Borrower-Bad", brs1, { it.name }) 

或者当lambda是方法的最后一个参数时:

 BorrowerX.findBorrowerX2("Borrower-Bad", brs1) { it.name } 

明确指出types和参数名称通常会提高可读性:

 BorrowerX.findBorrowerX2("Borrower-Bad", brs1) { borrower:BorrowerX -> borrower.name }