当前位置: 首页 > 知识库问答 >
问题:

Kotlin:如何将一个对象函数作为参数传递给另一个?

钮承恩
2023-03-14

我试图学习功能性Kotlin,并编写了以下测试代码:

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>): BorrowerX? {

            val coll: List<BorrowerX> = brs.filter { BorrowerX.getName(it) == n }

            if (coll.isEmpty()) {
                return null
            } else return coll.first()

        }

        fun findBorrowerX2(n: String, brs: ArrayList<BorrowerX>, f: (BorrowerX) -> String): BorrowerX? {

            val coll: List<BorrowerX> = 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(???))

并将迭代的借用器x传递给getName??

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

Kotlin:如何将一个函数作为参数传递给另一个?

提前感谢您对此的帮助!

编辑:

下面是我想做的等效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

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

共有2个答案

孔驰
2023-03-14

如lambdas文件所述:

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

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

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

明确说明类型和参数名称通常可以提高可读性:

BorrowerX.findBorrowerX2("Borrower-Bad", brs1) { borrower:BorrowerX -> borrower.name }
鲜于阳
2023-03-14

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

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

这里是借用者。Companion::getName是对在类BorrowerX的Companion对象(名为Companion)中声明的函数getName的引用。它的类型是kFunction 1

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

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

browerx::name的类型为KProperty1

 类似资料:
  • 问题内容: 我是ajax和回调函数的新手,如果我弄错了所有概念,请原谅我。 问题: 我可以将 回调 函数作为参数发送给将执行该回调的另一个函数吗? 问题答案: 对。函数引用与任何其他对象引用一样,您可以将它们传递到您的内心。 这是一个更具体的示例: 您还可以传递以下参数:

  • 问题内容: 我尝试了以下失败的尝试: 在函数a中,我可以使用arguments关键字来访问参数数组,而在函数b中,这些参数将丢失。有没有办法像我尝试的那样将参数传递给另一个javascript函数? 问题答案: 用于对in函数具有相同的访问权,如下所示:

  • 我想在函数中传递参数,但它给出了一个错误,这个语法保留供将来使用;要调用引用,请将其括在括号中:(foo::bar)(args)。此外,我还想制作一个genric runFunction,它可以接受任何参数,例如Int、String等。在这个示例代码中,我将sumInt(2)发送给runFunction,我还想发送concatatestring(“John”)。任何人都知道如何做到这一点。我试着搜

  • 问题内容: 我想将传递给function()的所有参数作为参数传递给内部的另一个function(), 这可以在被调用过程中完成并将它们传递给,但是还有另一种方法吗? 本来 但是如果我的func1签名是 我如何将它们全部发送到func2,而不使用 有没有一种方法像在javascript中? 问题答案: 显式比隐式更好, 但是如果您真的不想键入一些字符,请执行以下操作: 都是局部变量,因此您不能在调

  • 问题内容: 我不理解以下示例,可以说我具有以下功能: 为什么#1是正确的解决方案,而#2是错误的解决方案?基本上是一个字典,所以如果我想将参数传递给openX,我认为正确的方法是没有并给出字典。但是python显然不喜欢第二个,并告诉我我给了3个而不是2个参数。那么,这背后的原因是什么? 问题答案: 在第二个示例中,您提供3个参数:文件名,模式和字典()。但是Python期望:2个形式参数和关键字

  • 我有一个Kotlin代码: 现在我想从Java类调用这个方法。我不知道该怎么称呼这个。这是我试过的 但它显示了以下错误。