日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【Groovy】闭包 Closure ( 闭包参数绑定 | curry 函数 | rcurry 函数 | ncurry 函数 | 代码示例 )

發(fā)布時間:2025/6/17 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【Groovy】闭包 Closure ( 闭包参数绑定 | curry 函数 | rcurry 函数 | ncurry 函数 | 代码示例 ) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

文章目錄

  • 一、閉包參數(shù)綁定
    • 1、閉包參數(shù)綁定 curry 函數(shù)
    • 2、閉包參數(shù)綁定 rcurry 函數(shù)
    • 3、閉包參數(shù)綁定 ncurry 函數(shù)
  • 二、完整代碼示例





一、閉包參數(shù)綁定



閉包 Closure 提供了 curry , ncurry , rcurry 方法 , 這 333 個方法可以將 閉包 進行 參數(shù)綁定 ;

  • curry 函數(shù) : 從左到右 綁定 閉包參數(shù) ;
  • rcurry 函數(shù) : 從右到左 綁定 閉包參數(shù) ;
  • ncurry 函數(shù) : 指定從第 nnn 個參數(shù)開始綁定 閉包參數(shù) ;

上述 333 個方法都會 創(chuàng)建一個新的閉包 , 需要使用 新的變量接收新創(chuàng)建的閉包 , 原來的閉包變量保持不變 ;


1、閉包參數(shù)綁定 curry 函數(shù)


從左到右綁定參數(shù) ;


閉包參數(shù)綁定 curry 函數(shù)原型 :

/*** 從左到右進行參數(shù)綁定* <p>* 典型用法:* <pre class="groovyTestCase">* def multiply = { a, b {@code ->} a * b }* def doubler = multiply.curry(2)* assert doubler(4) == 8* </pre>* 注:對閉包 vararg 類型的功能進行了特殊處理。* 如果使用vararg參數(shù),則不會使用整個vararg數(shù)組,* 而是使用vararg數(shù)組的第一個參數(shù),* 如下例所示:* <pre class="groovyTestCase">* def a = { one, two, Object[] others {@code ->} one + two + others.sum() }* assert a.parameterTypes.name == ['java.lang.Object', 'java.lang.Object', '[Ljava.lang.Object;']* assert a(1,2,3,4) == 10* def b = a.curry(1)* assert b.parameterTypes.name == ['java.lang.Object', '[Ljava.lang.Object;']* assert b(2,3,4) == 10* def c = b.curry(2)* assert c.parameterTypes.name == ['[Ljava.lang.Object;']* assert c(3,4) == 10* def d = c.curry(3)* assert d.parameterTypes.name == ['[Ljava.lang.Object;']* assert d(4) == 10* def e = d.curry(4)* assert e.parameterTypes.name == ['[Ljava.lang.Object;']* assert e() == 10* assert e(5) == 15* </pre>*** @param arguments 要綁定的閉包參數(shù)* @return 返回已經(jīng)綁定參數(shù)的新的閉包 */public Closure<V> curry(final Object... arguments) {return new CurriedClosure<V>(this, arguments);}

代碼示例 :

// 定義閉包變量 , 聲明兩個參數(shù) a, b// 并為閉包指定默認值def closure5 = { a = 0, b = "Groovy" ->println "${a} : ${b}"}// 閉包有默認值 , 調(diào)用時可以不傳入?yún)?shù)closure5()// 從左到右綁定 閉包參數(shù)def closure6 = closure5.curry(1, "Gradle")// 閉包有默認值 , 調(diào)用時可以不傳入?yún)?shù)closure6()

執(zhí)行結(jié)果 :

0 : Groovy 1 : Gradle

2、閉包參數(shù)綁定 rcurry 函數(shù)


閉包參數(shù)綁定 rcurry 函數(shù)是從右到左綁定參數(shù) , 但是 參數(shù)的順序還是從左到右的順序 , 這點要注意 ;


閉包參數(shù)綁定 rcurry 函數(shù)原型 :

/*** 從右到左綁定閉包參數(shù)* 根據(jù)普通的 curry()方法,參數(shù)在右側(cè)而不是左側(cè)提供。* 典型用法:* <pre class="groovyTestCase">* def divide = { a, b {@code ->} a / b }* def halver = divide.rcurry(2)* assert halver(8) == 4* </pre>** curried參數(shù)的位置將被延遲計算,* 例如,如果有兩個重載的doCall方法可用,* 則提供的參數(shù)加上curried參數(shù)將被連接,結(jié)果將用于方法選擇。** @param arguments 綁定的參數(shù)* @return 綁定參數(shù)后的新閉包 * @see #curry(Object...)*/public Closure<V> rcurry(final Object... arguments) {return new CurriedClosure<V>(-arguments.length, this, arguments);}

代碼示例 :

// 定義閉包變量 , 聲明兩個參數(shù) a, b// 并為閉包指定默認值def closure5 = { a = 0, b = "Groovy" ->println "${a} : ${b}"}// 閉包有默認值 , 調(diào)用時可以不傳入?yún)?shù)closure5()// 從右到左綁定 閉包參數(shù)def closure7 =closure5.rcurry(2, "Java")// 閉包有默認值 , 調(diào)用時可以不傳入?yún)?shù)closure7()

執(zhí)行結(jié)果 :

0 : Groovy 2 : Java

3、閉包參數(shù)綁定 ncurry 函數(shù)


從第 nnn 個參數(shù)開始綁定閉包中的參數(shù) ;

注意調(diào)用了 curry / ncurry / rcurry 方法后 , 所有的默認值都被覆蓋清除了 , 如果 從第 222 個參數(shù)開始綁定閉包參數(shù) , 則此時第一個參數(shù)也沒有默認值了 , 調(diào)用時 , 必須傳入第一個參數(shù)只才可以 , 否則運行時會報錯 ;


閉包參數(shù)綁定 ncurry 函數(shù)原型 :

/*** 從給定的索引處開始綁定閉包參數(shù)** @param argument 要綁定參數(shù)的閉包* @return the 綁定參數(shù)后新創(chuàng)建的閉包* @see #ncurry(int, Object...)*/public Closure<V> ncurry(int n, final Object argument) {return ncurry(n, new Object[]{argument});}

代碼示例 :

// 定義閉包變量 , 聲明兩個參數(shù) a, b// 并為閉包指定默認值def closure5 = { a = 0, b = "Groovy" ->println "${a} : ${b}"}// 閉包有默認值 , 調(diào)用時可以不傳入?yún)?shù)closure5()// 從第 n 個參數(shù)開始綁定閉包參數(shù) ,// 注意調(diào)用了 curry / ncurry / rcurry 方法后 , 之前的默認值就覆蓋了// 此時第一個參數(shù)沒有值了// 調(diào)用時 , 必須傳入第一個參數(shù)只才可以def closure8 =closure5.ncurry(1, "Kotlin")// 閉包的第一個默認值被取消 , 此時必須傳入第一個參數(shù)的值才能執(zhí)行該閉包// 否則報錯closure8(3)

執(zhí)行結(jié)果 :

0 : Groovy 3 : Kotlin



二、完整代碼示例



完整代碼示例 :

import org.codehaus.groovy.ant.Groovyclass Test {static void main(args) {// I. 接收默認一個參數(shù)的變薄// 定義閉包變量def closure = {println "Accept One Arguments : ${it}"}// 調(diào)用閉包closure.call("Hello");closure("Hello");// II. 不接收任何參數(shù)的閉包// 定義閉包變量 , 不允許傳入?yún)?shù)def closure2 = { ->println "Not Accept Arguments"}// 傳入?yún)?shù)會報錯//closure2("Hello")// 調(diào)用閉包 , 不能傳入?yún)?shù)closure2.call();closure2();// III. 接收一個自定義參數(shù)的閉包// 定義閉包變量 , 聲明一個參數(shù) adef closure3 = { a ->println "${a}"}// 調(diào)用閉包 , 不能傳入?yún)?shù)closure3.call(1);closure3(2);// IV. 接收兩個自定義參數(shù)的閉包// 定義閉包變量 , 聲明兩個參數(shù) a, b// 在閉包中打印這兩個參數(shù)def closure4 = { a, b ->println "${a} : ${b}"}// 調(diào)用閉包 , 不能傳入?yún)?shù)closure4.call(1, 2);closure4(3, 4);// V. 為閉包參數(shù)指定默認值// 定義閉包變量 , 聲明兩個參數(shù) a, b// 并為閉包指定默認值def closure5 = { a = 0, b = "Groovy" ->println "${a} : ${b}"}// 閉包有默認值 , 調(diào)用時可以不傳入?yún)?shù)closure5()// 從左到右綁定 閉包參數(shù)def closure6 = closure5.curry(1, "Gradle")// 閉包有默認值 , 調(diào)用時可以不傳入?yún)?shù)closure6()// 從右到左綁定 閉包參數(shù)def closure7 =closure5.rcurry(2, "Java")// 閉包有默認值 , 調(diào)用時可以不傳入?yún)?shù)closure7()// 從第 n 個參數(shù)開始綁定閉包參數(shù) ,// 注意調(diào)用了 curry / ncurry / rcurry 方法后 , 之前的默認值就覆蓋了// 此時第一個參數(shù)沒有值了// 調(diào)用時 , 必須傳入第一個參數(shù)只才可以def closure8 =closure5.ncurry(1, "Kotlin")// 閉包的第一個默認值被取消 , 此時必須傳入第一個參數(shù)的值才能執(zhí)行該閉包// 否則報錯closure8(3)} }

執(zhí)行結(jié)果 :

Accept One Arguments : Hello Accept One Arguments : Hello Not Accept Arguments Not Accept Arguments 1 2 1 : 2 3 : 4 0 : Groovy 1 : Gradle 2 : Java 3 : Kotlin

《新程序員》:云原生和全面數(shù)字化實踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀

總結(jié)

以上是生活随笔為你收集整理的【Groovy】闭包 Closure ( 闭包参数绑定 | curry 函数 | rcurry 函数 | ncurry 函数 | 代码示例 )的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 日韩精品免费电影 | av在线毛片 | 亚洲成人自拍视频 | jizz内谢中国亚洲jizz | 国产鲁鲁| 亚洲色图五月天 | 久久一区视频 | 久久久久久欧美精品se一二三四 | 久草视频在线资源站 | 欧美日韩成人免费观看 | 国产精品久久久久久久久久久久久久 | 国精产品一区一区三区视频 | 日本少妇做爰全过程毛片 | 精品少妇人妻一区二区黑料社区 | 卡一卡二在线视频 | 中文字幕一区二区三区四区 | 偷拍第一页 | 亚洲国产精品一区二区久久hs | 国产大片在线观看 | 落日余晖 | 热热色国产 | 婷婷久久亚洲 | 超碰免费公开 | 亚洲三区在线观看无套内射 | 亚洲一二三四在线 | 人体毛片 | 明日花绮罗高潮无打码 | 超碰伊人| 阿拉伯性视频xxxx | 国产色爽 | 夜夜操天天操 | 黄色aaa毛片| av色图| 真实乱视频国产免费观看 | 性史性农村dvd毛片 日韩精品在线视频观看 | avt天堂网 | 欧美视频三区 | 伊人称影院| 能看的av网站 | 一边摸内裤一边吻胸 | 成人午夜视频免费在线观看 | 亚洲一二区视频 | 亚洲精品视频三区 | 精品久久久久久久久久岛国gif | 精品国产一区二区三区久久 | www九九九| 97在线国产 | 亚洲图片综合区 | 日韩在线免费av | 麻豆自拍视频 | 秋霞午夜视频 | 百合sm惩罚室羞辱调教 | hd性videos意大利精品 | 成人av视屏 | 中文字幕一区二区三区门四区五区 | 日韩在线第二页 | 国产人妻精品久久久久野外 | 欧美一级特黄aa大片 | 国产福利在线视频观看 | 三级自拍视频 | 日韩成人片 | 天堂中文视频在线 | 国产精品老女人 | 极品少妇xxxx精品少妇偷拍 | 亚洲国产精品久久久 | 色婷婷亚洲 | 你懂的在线免费观看 | 免费成人深夜 | 日本欧美在线播放 | 色婷婷激情av | 91精品国产91久久久久久吃药 | 精品香蕉一区二区三区 | 亚洲色图久久 | 日韩怡红院 | 亚洲国产精品久久久久久6q | 久久亚洲色图 | 久久久久久国产精品三区 | 日韩精品电影在线 | 精品国产乱码久久久久久闺蜜 | 欧美大片在线观看 | 伊人avav | 国产毛片18 | 中文字幕一区二区三区久久久 | 成人免费视频国产在线观看 | 夜夜夜操操操 | 亚洲精品www久久久久久广东 | 日本欧美中文字幕 | 国产成人av一区二区 | 亚洲欧美日韩国产综合 | 一级黄色免费视频 | jizz日本免费 | 久久一精品 | 亚洲每日在线 | 欧美与黑人午夜性猛交久久久 | 富婆如狼似虎找黑人老外 | 美女网站全黄 | 欧美成人a∨高清免费观看 国产精品999视频 | 亚洲成a | 色女孩综合网 |