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

Kotlin Lambda函数作为参数

谭京
2023-03-14

我是Kotlin的新手,很难理解下面的代码

private fun <T> catchAsyncExceptions(f: () -> CompletableFuture<T>) =
    try {
        f().get()
    } catch (e: ExecutionException) {
        throw e.cause!!
    }

所以这个函数叫做f,它的输入参数是一个名为f的函数,它是()-

catchAsyncExceptions(someFunctionThatTakesNoArgumentAndReturnsCompletableFuture)

然而,我看到的用法是

override fun getUserInfo(userId: String) =
    catchAsyncExceptions {
        membersClient.getUserLocation(
            GetUserLocationRequest(userId)
        )
            .thenApply { response ->
                val (success, error) = parseSuccessAndError<GetUserLocationResponseResult.Success>(response.result!!)
                error?.let {
                    UserInfoResponse(
                        error = error.code
                        )
                    )
                } ?: run {
                    UserInfoResponse(
                        data = UserInfoResponseDto(
                            location = success?.success?.location.toString(),
                        )
                    )
                }
            }
    }

请注意

membersClient.getUserLocation(
            GetUserLocationRequest(userId)
        )

返回CompletableFuture类型

我特别困惑为什么它是一个卷曲的括号而不是括号

catchAsyncExceptions {
...
}

共有1个答案

杨鸿畅
2023-03-14

在Kotlin中,当使用lambda函数作为参数时,括号是完全可选的。您可以将实现重写为:

catchAsyncExceptions({
    membersClient.getUserLocation(
        GetUserLocationRequest(userId)
    )
        .thenApply({ response ->
            val (success, error) = parseSuccessAndError<GetUserLocationResponseResult.Success>(response.result!!)
            error?.let({
                UserInfoResponse(
                    error = error.code
                    )
                )
            }) ?: run({
                UserInfoResponse(
                    data = UserInfoResponseDto(
                        location = success?.success?.location.toString(),
                    )
                )
            })
        })
})

这是一个完美的工作代码。为简单起见,省略括号以使代码更具可读性。

 类似资料:
  • 函数可以作为其它函数的参数进行传递,然后在其它函数内调用执行,一般称之为回调。下面是一个将函数作为参数的简单例子(function_parameter.go): package main import ( "fmt" ) func main() { callback(1, Add) } func Add(a, b int) { fmt.Printf("The sum

  • 问题内容: 我想在Postgres函数中将表名作为参数传递。我尝试了这段代码: 我得到了这个: 这是我更改为此时遇到的错误: 可能有效,因为如果没有where 得到的部分1,则表示已选定某项。为什么第一个工作和第二个工作不能同时进行?以及如何解决呢? 问题答案: 这可以进一步简化和改进: 使用架构限定名称进行调用(请参见下文): 或者: 要点 使用OUT参数简化功能。您可以直接选择动态SQL的结果

  • 我目前有一个,但是为了灵活性,我希望能够分配一个lambda表达式,将作为映射中的值返回。 所以我创建了这个模板类: 并像这样使用它: IntelliSense提供了更多信息: 多个操作符“=”匹配这些操作数:function“valueorfunction::operator=(const std::function&other)[with T=std::wstring]”function“va

  • 问题内容: 是否可以通过以参数作为参数的javascript函数? 例: 问题答案: 使用“关闭”: 这将创建一个匿名的临时函数包装器,该包装器知道该参数并将其传递给实际的回调实现。

  • 问题内容: 如何在不执行“父”函数或不使用函数的情况下将函数作为参数传递?(因为我已经读到它是不安全的。) 我有这个: 它可以工作,但是问题是在调用函数时触发,而不是在函数中使用时触发。 根据我所读的内容,我可以使用来解决它,但这不是最佳实践。如何在JavaScript中将函数作为参数传递? 问题答案: 您只需要删除括号: 然后,这将传递函数而不先执行它。 这是一个例子:

  • 主要内容:用数组作函数参数在C语言中,函数的参数不仅可以是整数、小数、字符等具体的数据,还可以是指向它们的 指针。用指针变量作函数参数可以将函数外部的地址传递到函数内部,使得在函数内部可以操作函数外部的数据,并且这些数据不会随着函数的结束而被销毁。 像数组、字符串、动态分配的内存等都是一系列数据的集合,没有办法通过一个参数全部传入函数内部,只能传递它们的指针,在函数内部通过指针来影响这些数据集合。 有的时候,对于整数、小数