日韩性视频-久久久蜜桃-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)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 欧美黑人精品一区二区不卡 | 日韩欧美精品国产 | 久一视频在线 | www夜夜| 欧美激情校园春色 | 99ri精品 | 国产精品久久9 | 国产在线观看一区二区三区 | 色婷婷免费 | 成年人爱爱视频 | av中文字幕在线免费观看 | 亚洲图片欧美在线 | 欧美乱妇狂野欧美在线视频 | 欧美日韩中文字幕在线播放 | 五月天三级| 一级片免费在线 | 成人av高清在线观看 | 日本孰妇毛茸茸xxxx | 亚洲天堂资源网 | 波多野结衣办公室33分钟 | 户外少妇对白啪啪野战 | 欧美视频免费看欧美视频 | 国产免费网址 | 麻豆av导航 | 日韩三级免费看 | 日韩国产精品一区二区 | 99资源在线 | 欧美在线亚洲 | 天天躁狠狠躁狠狠躁夜夜躁68 | 人日人视频 | 无毒黄色网址 | 国产婷婷色一区二区三区在线 | 91色| 国产精品美女一区二区 | 久久久精品综合 | 免费爱爱网站 | 午夜少妇 | 国产精品久久久久久久久晋中 | 岛国一区二区三区 | 波多av在线 | 亚洲一区二区三区免费观看 | 婷婷综合影院 | 久久对白 | 国产又黄又嫩又滑又白 | 99爱99| 久久精品国产一区二区电影 | 久久网亚洲 | 九色在线视频 | 狠狠艹 | 色婷婷av一区 | 超碰碰碰碰 | 综合在线观看 | 欧美一级网 | 人人草人人爽 | 欧美另类自拍 | 亚洲乱乱 | 日韩精品无码一区二区三区 | 免费视频污 | 女王脚交玉足榨精调教 | 精品无码人妻一区 | 日韩一级网站 | 亚洲天天影视 | 国产精品久久久 | 岛国免费av| 在线观看国产麻豆 | 久久久av片| 男人桶女人桶爽30分钟 | 国产视频在线观看一区 | 在线黄av | 国产精品扒开腿做爽爽爽a片唱戏 | 日本做爰全过程免费看 | 全国探花| 96精品在线 | 日美一级片| 快色视频在线观看 | 日本中文字幕在线免费观看 | 国产精品扒开腿做爽爽爽视频 | 国产又粗又黄又爽又硬 | 天天干天天狠 | 亚洲国产精品免费在线观看 | 夜夜超碰 | www.毛片| 国产毛片久久久久久 | 蜜桃综合网 | 欧美 日韩 国产 在线 | 高清成人 | 日韩高清国产一区在线 | 亚洲欧洲无码一区二区三区 | 午夜欧美日韩 | 亚洲色图日韩 | 亚洲s码欧洲m码国产av | 特黄网站 | 日韩精品第一 | 国产黄色免费在线观看 | 人妻精品久久久久中文字幕 | 精品少妇一区二区三区在线观看 | 成年人午夜影院 | 一本色道久久综合亚洲精品按摩 | 亚洲免费av一区 |