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

在高阶函数中使用参数调用lambda

蒯胜泫
2023-03-14

我是java / kotlin函数式编程的新手,并做了一些练习。只是想知道如何在调用它时传递lambda的参数。例如,在这里调用一些方法,我需要传递一个Int参数。

fun lambdaTest( someMethod: (Int) -> Boolean){
   someMethod()
}

如何做到这一点?答案可能非常简单,我只是没有在任何地方找到它,在文档中只有列表的例子,在这种情况下答案是清楚的:

fun <T, R> List<T>.map(transform: (T) -> R): List<R> {
    val result = arrayListOf<R>()
    for (item in this)
        result.add(transform(item))
    return result
}

共有2个答案

田博超
2023-03-14

想想(国际) -

interface Function<I, O> {
    fun inkoke(param: I): O
}

I是输入参数的类型,O是输出类型(返回值)的类型。

静态编程语言中的所有lambda实际上都是一种简写语法,用于使用给定数量的参数和返回类型的单个方法invoke定义对象。让我们考虑到这一点重写您的高阶函数。

fun lambdaTest(someMethod: Function<Int, Boolean>) {
    // Call invoke with an Int paramater. This returns a Boolean.
    val isTheAnswerOfTheUniverse = someMethod.invoke(42)
}

现在,我们调用这个方法:

// We can pass an anonymous class as the parameter
lambdaTest(object : Function<Int, Boolean>() {
    override fun invoke(param: Int): Boolean {
        println("Lambda called with number: $param")
        // Prints "Lambda called with number: 42"
        return param == 42
    }
})

这与(国际)相同 -

  • 用于将函数定义为变量的专用语法
  • 可以省略 .invoke(因为它是运算符重载)
  • 用于定义 lambda 的专用语法,就像 Java 8 一样(Kotlin 使用大括号)。
  • 如果 lambda 是高阶函数的最后一个参数,则可以在括号外表示 lambda。

下面是lambda语法的等价物:

fun lambdaTest(someMethod: (Int) -> Boolean) {
    val isTheAnswerOfTheUniverse = someMethod(42)
}

fun main(args: Array<String>) {
    lambdaTest { param ->
        println("Lambda called with number: $param")
        // Prints "Lambda called with number: 42"

        // The result of the last expression is returned
        param == 42
    }
}

周浩博
2023-03-14

这里你需要传递一个以Int为参数并返回Boolean的函数。

lambdaTest { int ->
     int > 0 // can be also changed to it
}

如果Int参数大于0,则返回true。

如果您想要更多参数:

fun lambdaTest( someMethod: (Int, String) -> Unit){ // Unit means do not return anything
     someMethod(1, "Kotlin")
}

并称之为:

lambdaTest { int, string ->
    println("Passed Int: $int, and String: $string as parameter")
    // Output = Passed Int: 1, and String: Kotlin as parameter
}
 类似资料:
  • 问题内容: 我想使用快速的高阶函数(map)从给定的UIView.subviews数组中删除所有Subviews。线 导致错误“无法使用类型’(()-> )’的参数列表调用’map’” 我现在想知道编译器需要我什么。 问题答案: 我会说地图不适合这种操作。它基于其他sequence元素创建了一个新序列,但是您不想创建一个序列,而只想遍历它们并将一个函数应用于它们。暂时没有与您想要的功能匹配的高阶函

  • 常用高阶函数 1.map 对于原始集合里的每一个元素, 以一个变换后的元素替换之形成一个新的集合 1.1 flatmap 对于元素是集合的集合, 可以得到单级的集合 let results = [[1, 2, 3], [4, 5, 6], [7, 8, 9]] let allResults = results.flatMap{ $0.map{ $0 * 10 } } let passMarks =

  • Rust 提供了高阶函数(Higher Order Function, HOF)。执行一个或多个函数来产生一个用处更大的函数。HOF 和惰性迭代器(lazy iterator)给 Rust 带来了函数式的风格(英文原文:HOFs and lazy iterators give Rust its functional flavor.)。 fn is_odd(n: u32) -> bool {

  • 高阶函数与普通函数的不同在于,它可以使用一个或多个函数作为参数,可以将函数作为返回值。rust的函数是first class type,所以支持高阶函数。而,由于rust是一个强类型的语言,如果要将函数作为参数或返回值,首先需要搞明白函数的类型。下面先说函数的类型,再说函数作为参数和返回值。 函数类型 前面说过,关键字fn可以用来定义函数。除此以外,它还用来构造函数类型。与函数定义主要的不同是,构

  • Haskell 中的函数可以接受函数作为参数也可以返回函数作为结果,这样的函数就被称作高阶函数。高阶函数可不只是某简单特性而已,它贯穿于 Haskell 的方方面面。要拒绝循环与状态的改变而通过定义问题"是什么"来解决问题,高阶函数必不可少。它们是编码的得力工具。 Curried functions 本质上,Haskell 的所有函数都只有一个参数,那么我们先前编那么多含有多个参数的函数又是怎么回

  • 简介 高阶函数(Higher Order Function)是一种以函数为参数的函数。它们都被用于映射(mapping)、过滤(filtering)、归档(folding)和排序(sorting)表。高阶函数提高了程序的模块性。编写对各种情况都适用的高阶函数与为单一情况编写递归函数相比,可以使程序更具可读性。比如说,使用一个高阶函数来实现排序可以使得我们使用不同的条件来排序,这就将排序条件和排序过