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 }