Java Kotlin:调用(Int,Int)的惯用方法-->;带对的Int<;Int,Int>;?
我正在寻找:Java Kotlin:调用(Int,Int)的惯用方法-->;带对的Int<;Int,Int>;?,java,functional-programming,kotlin,Java,Functional Programming,Kotlin,我正在寻找: sum.tuple(x),或 sum(*x) 当然,上面的任何一个都不能用Kotlin 1.1.3-2编译。那么,我是否被困于总和(x.first,x.second) 编辑: 概括有用的答案,我认为这是目前最接近的事情: fun sum(a: Int, b: Int) = a + b val x = 1.to(2) fun Function2.tuple(x:Pair):R=invoke(x.first,x.second) 了解您的需求后,我认为您根本不需要任何重载功能/扩展功能
sum.tuple(x)
,或sum(*x)
总和(x.first,x.second)
编辑:
概括有用的答案,我认为这是目前最接近的事情:
fun sum(a: Int, b: Int) = a + b
val x = 1.to(2)
fun Function2.tuple(x:Pair):R=invoke(x.first,x.second)
了解您的需求后,我认为您根本不需要任何重载功能/扩展功能,只需使用,例如:
fun <P1, P2, R> Function2<P1,P2,R>.tupled(x: Pair<P1, P2>): R = invoke(x.first, x.second)
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)
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])
您还可以像Java一样在Kotlin中重载函数
sum
,例如:
fun <P1, P2, R> Function2<P1,P2,R>.tupled(x: Pair<P1, P2>): R = invoke(x.first, x.second)
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)
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])
扩展功能也是一种非常方便的方式:
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)
fun Pair.sum()=this.first+this.second
val x=1.至(2)
x、 sum()
如果您想使用Kotlin的甜言蜜语,还可以编写以下内容:
fun Pair<Int, Int>.sum() = this.first + this.second
val x = 1.to(2)
x.sum()
valsum:(Pair)->Int={(a,b)->a+b}
现在,sum
不能用2Int调用:(我不是要替换旧的sum,你可以保留它们,它们都不确定。那么你的答案类似于@holi java。我肯定我可以有两个不同版本的相同方法,但如果该语言可以为我这样做就好了。请记住,解构声明不是参数类型的更改。你不能简单地(到目前为止)使用(Int,Int)->Int
作为(Pair)->Int
。每一种方法在内部的工作方式都不同。在内部,系统调用Pair.component1()
和Pair.component2()
填充看起来像参数的变量,但事实上它们不是。好吧,如果我也有乘,和减
?为每个变量创建一个扩展函数是一项艰巨的工作。是的,但是你只需要对该函数进行一次操作,然后你就可以通过导入扩展函数在任何地方使用它。你键入的intArray
应该是intArray
。但更重要的是sum(*intArray(1,2))
没有编译。第二个Int
与构造函数intArray(大小:Int,init:->Int)的init
函数冲突
@Abhijit Sarkar是的,我没有编辑,只有两只手。谢谢,:)你能帮我理解tupled
扩展fn吗(我是Kotlin的新手)“invoke
是在函数2
中定义的,对吗?那么你是在给它本身添加相同的数字吗?这不是我问题中的和
。@Abhijit Sarkar hi,它是一个Kotin内置类型,只是(T,T)的别名)->R
@Abhijit Sarkar是的,invoke
是函数
s的成员运算符函数。它是,但您必须使用函数引用来获取和