java - Kotlin:用 Pair<Int, Int> 调用 (Int, Int) -> Int 的惯用方式?

标签 java functional-programming kotlin

fun sum(a: Int, b: Int) = a + b
val x = 1.to(2)

我在找:

  1. sum.tupled(x),或者
  2. sum(*x)

当然,以上都不能用 Kotlin 1.1.3-2 编译。所以我是否坚持使用 sum(x.first, x.second)

编辑:

概括有用的答案,我认为这是目前最接近的:

fun <P1, P2, R> Function2<P1,P2,R>.tupled(x: Pair<P1, P2>): R = invoke(x.first, x.second)

最佳答案

了解您的需求后,我认为您根本不需要任何重载函数/扩展函数,只需使用KCallable#call即可。相反,例如:

val x  = arrayOf(1, 2)

//                v--- top-level  functions 
val result:Int = ::sum.call(*x) 
//                  v--- member-level  functions 
val result:Int = this::sum.call(*x) 

你也可以像 Java 一样在 Kotlin 中重载函数 sum,例如:

sum(1 to 2)
sum(*intArrayOf(1, 2))

fun sum(tuple: Pair<Int, Int>) = sum(tuple.first, tuple.second)

fun sum(vararg pair: Int) = sum(pair[0], pair[1])

对于sum.tupled(x)你可以写一个扩展函数,例如:

val sum: (Int, Int) -> Int = ::sum // top-level function
//OR
val sum:(Int, Int)->Int = this::sum // member scope function


// the final form is what you want 
//                       v
val result:Int = sum.tupled(1 to 2)

fun <T1,T2,R> Function2<T1,T2,R>.tupled(x:Pair<T1,T2>):R = invoke(x.first,x.second)

关于java - Kotlin:用 Pair<Int, Int> 调用 (Int, Int) -> Int 的惯用方式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45157737/

相关文章:

java - 使用java编程语言合并一些ogg音频文件

java - 可利用的 Java 函数

java - 使用 jacksonObjectMapper 将 JSON 反序列化为不同类型

android - 用作 LaunchedEffect 键时出现 NetworkOnMainThreadException

Kotlin 。从集合中获取不同的值

java - 如何使用Java在Android GridLayout中设置间距?

java - 如何让鼠标悬停时圆圈改变颜色

list - F#::遍历列表然后再次返回

c# - Nullable 可以用作 C# 中的仿函数吗?

python - 为什么这个高阶函数不通过 mypy 中的静态类型检查?