代码之家  ›  专栏  ›  技术社区  ›  Matrix

如何在kotlin->中使用lambda

  •  0
  • Matrix  · 技术社区  · 3 年前

    有一个关于->在科特林。

       fun test0 (a: String, combine: (b: String) -> String ): String {
            return combine(a)
       }
    

    上面有一个示例函数,如何使用这个函数? 我不知道如何通过联合收割机。

    已尝试以下操作:

        private fun getFold(a: String): String {
            return a
        }
    
        fun test() {
            var a: String = "a"
            val test1 = test0 (a,  combine = getFold(a))
        }
    

    合并中的同步错误=getFold(a)),例如:

    类型不匹配。必需:(字符串)找到的字符串:字符串

    那么如何通过parm联合收割机呢?

    2 回复  |  直到 3 年前
        1
  •  5
  •   gidds    3 年前

    在您的示例中, combine 是类型的参数 (b: String) -> String ,这是一个取单个的函数 String 并返回 一串

    (事实上,您不需要命名参数 b ;它可以简单地写 (String) -> String .)

    将函数作为参数传递的主要方法有三种:

    1. 作为 lambda 这可能是最常见的:直接在大括号中提供函数体。例如:
    val test1 = test0(a, { it })
    

    λ在这里 { it } ( it 是一个关键字,可以在采用单个参数的lambdas中使用,并引用该参数。等效的可能是 { a -> a } .)

    事实上,因为函数参数是最后一个参数,Kotlin允许您移动lambda 之后 parens:

    val test1 = test0(a){ it }
    

    这意味着完全相同,但在某些情况下,它可以读得更好(通过使函数调用看起来像语言语法;函数像 map filter 经常这样称呼)。

    1. 作为 anonymous function 这类似于lambda,但语法更像是定义一个普通函数;它更详细,但给了你更多的控制权。在这种情况下,您可以使用正常功能的身体:
    val test2 = test0(a, fun(b: String): String { return b })
    

    或表达式体:

    val test2 = test0(a, fun(b: String) = b)
    
    1. 作为 callable reference 这适用于您有想要使用的现有方法或函数时。(您的项目或库中可能已经有了合适的函数;或者代码可能太长,无法整齐地放入lambda中。)

    使用 :: 操作员,例如:

    val test3 = test0(a, ::getFold)
    

    可以通过这种方式引用方法、顶级函数、扩展函数、属性或构造函数。(如果它不是顶级函数,您可能需要告诉编译器它属于哪个对象/类,就像直接调用它时一样。例如。 myInstance::methodName .)

    看起来这就是问题中的代码所要做的。然而,lambda语法通常更简单、更清晰,所以如果您出于任何其他原因不需要现有函数,请考虑这一点。


    (问题中的错误消息是因为 combine = getFold(a) 呼叫 getFold() ,并尝试分配其 后果 结合 参数结果是String,而不是函数类型,因此类型不匹配。)

        2
  •  2
  •   Nikolai Shevchenko    3 年前
    test0(a, combine = ::getFold)
    

    test0(a, combine = this::getFold)
    
        3
  •  1
  •   bylazy    3 年前

    或者像这样:

    combine = {getFold(it)}