Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Kotlin:调用(Int,Int)的惯用方法-->;带对的Int<;Int,Int>;?_Java_Functional Programming_Kotlin - Fatal编程技术网

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)
  • 当然,上面的任何一个都不能用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)
    
    了解您的需求后,我认为您根本不需要任何重载功能/扩展功能,只需使用,例如:

    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
    不能用2
    Int调用:(我不是要替换旧的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的成员运算符函数。它是,但您必须使用函数引用来获取