【Groovy】闭包 Closure ( 闭包参数绑定 | curry 函数 | rcurry 函数 | ncurry 函数 | 代码示例 )
文章目錄
- 一、閉包參數(shù)綁定
- 1、閉包參數(shù)綁定 curry 函數(shù)
- 2、閉包參數(shù)綁定 rcurry 函數(shù)
- 3、閉包參數(shù)綁定 ncurry 函數(shù)
- 二、完整代碼示例
一、閉包參數(shù)綁定
閉包 Closure 提供了 curry , ncurry , rcurry 方法 , 這 333 個(gè)方法可以將 閉包 進(jìn)行 參數(shù)綁定 ;
- curry 函數(shù) : 從左到右 綁定 閉包參數(shù) ;
- rcurry 函數(shù) : 從右到左 綁定 閉包參數(shù) ;
- ncurry 函數(shù) : 指定從第 nnn 個(gè)參數(shù)開始綁定 閉包參數(shù) ;
上述 333 個(gè)方法都會(huì) 創(chuàng)建一個(gè)新的閉包 , 需要使用 新的變量接收新創(chuàng)建的閉包 , 原來的閉包變量保持不變 ;
1、閉包參數(shù)綁定 curry 函數(shù)
從左到右綁定參數(shù) ;
閉包參數(shù)綁定 curry 函數(shù)原型 :
/*** 從左到右進(jìn)行參數(shù)綁定* <p>* 典型用法:* <pre class="groovyTestCase">* def multiply = { a, b {@code ->} a * b }* def doubler = multiply.curry(2)* assert doubler(4) == 8* </pre>* 注:對閉包 vararg 類型的功能進(jìn)行了特殊處理。* 如果使用vararg參數(shù),則不會(huì)使用整個(gè)vararg數(shù)組,* 而是使用vararg數(shù)組的第一個(gè)參數(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);}代碼示例 :
// 定義閉包變量 , 聲明兩個(gè)參數(shù) a, b// 并為閉包指定默認(rèn)值def closure5 = { a = 0, b = "Groovy" ->println "${a} : ${b}"}// 閉包有默認(rèn)值 , 調(diào)用時(shí)可以不傳入?yún)?shù)closure5()// 從左到右綁定 閉包參數(shù)def closure6 = closure5.curry(1, "Gradle")// 閉包有默認(rèn)值 , 調(diào)用時(shí)可以不傳入?yún)?shù)closure6()執(zhí)行結(jié)果 :
0 : Groovy 1 : Gradle2、閉包參數(shù)綁定 rcurry 函數(shù)
閉包參數(shù)綁定 rcurry 函數(shù)是從右到左綁定參數(shù) , 但是 參數(shù)的順序還是從左到右的順序 , 這點(diǎn)要注意 ;
閉包參數(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ù)的位置將被延遲計(jì)算,* 例如,如果有兩個(gè)重載的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);}代碼示例 :
// 定義閉包變量 , 聲明兩個(gè)參數(shù) a, b// 并為閉包指定默認(rèn)值def closure5 = { a = 0, b = "Groovy" ->println "${a} : ${b}"}// 閉包有默認(rèn)值 , 調(diào)用時(shí)可以不傳入?yún)?shù)closure5()// 從右到左綁定 閉包參數(shù)def closure7 =closure5.rcurry(2, "Java")// 閉包有默認(rèn)值 , 調(diào)用時(shí)可以不傳入?yún)?shù)closure7()執(zhí)行結(jié)果 :
0 : Groovy 2 : Java3、閉包參數(shù)綁定 ncurry 函數(shù)
從第 nnn 個(gè)參數(shù)開始綁定閉包中的參數(shù) ;
注意調(diào)用了 curry / ncurry / rcurry 方法后 , 所有的默認(rèn)值都被覆蓋清除了 , 如果 從第 222 個(gè)參數(shù)開始綁定閉包參數(shù) , 則此時(shí)第一個(gè)參數(shù)也沒有默認(rèn)值了 , 調(diào)用時(shí) , 必須傳入第一個(gè)參數(shù)只才可以 , 否則運(yùn)行時(shí)會(huì)報(bào)錯(cuò) ;
閉包參數(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});}代碼示例 :
// 定義閉包變量 , 聲明兩個(gè)參數(shù) a, b// 并為閉包指定默認(rèn)值def closure5 = { a = 0, b = "Groovy" ->println "${a} : ${b}"}// 閉包有默認(rèn)值 , 調(diào)用時(shí)可以不傳入?yún)?shù)closure5()// 從第 n 個(gè)參數(shù)開始綁定閉包參數(shù) ,// 注意調(diào)用了 curry / ncurry / rcurry 方法后 , 之前的默認(rèn)值就覆蓋了// 此時(shí)第一個(gè)參數(shù)沒有值了// 調(diào)用時(shí) , 必須傳入第一個(gè)參數(shù)只才可以def closure8 =closure5.ncurry(1, "Kotlin")// 閉包的第一個(gè)默認(rèn)值被取消 , 此時(shí)必須傳入第一個(gè)參數(shù)的值才能執(zhí)行該閉包// 否則報(bào)錯(cuò)closure8(3)執(zhí)行結(jié)果 :
0 : Groovy 3 : Kotlin二、完整代碼示例
完整代碼示例 :
import org.codehaus.groovy.ant.Groovyclass Test {static void main(args) {// I. 接收默認(rèn)一個(gè)參數(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ù)會(huì)報(bào)錯(cuò)//closure2("Hello")// 調(diào)用閉包 , 不能傳入?yún)?shù)closure2.call();closure2();// III. 接收一個(gè)自定義參數(shù)的閉包// 定義閉包變量 , 聲明一個(gè)參數(shù) adef closure3 = { a ->println "${a}"}// 調(diào)用閉包 , 不能傳入?yún)?shù)closure3.call(1);closure3(2);// IV. 接收兩個(gè)自定義參數(shù)的閉包// 定義閉包變量 , 聲明兩個(gè)參數(shù) a, b// 在閉包中打印這兩個(gè)參數(shù)def closure4 = { a, b ->println "${a} : ${b}"}// 調(diào)用閉包 , 不能傳入?yún)?shù)closure4.call(1, 2);closure4(3, 4);// V. 為閉包參數(shù)指定默認(rèn)值// 定義閉包變量 , 聲明兩個(gè)參數(shù) a, b// 并為閉包指定默認(rèn)值def closure5 = { a = 0, b = "Groovy" ->println "${a} : ${b}"}// 閉包有默認(rèn)值 , 調(diào)用時(shí)可以不傳入?yún)?shù)closure5()// 從左到右綁定 閉包參數(shù)def closure6 = closure5.curry(1, "Gradle")// 閉包有默認(rèn)值 , 調(diào)用時(shí)可以不傳入?yún)?shù)closure6()// 從右到左綁定 閉包參數(shù)def closure7 =closure5.rcurry(2, "Java")// 閉包有默認(rèn)值 , 調(diào)用時(shí)可以不傳入?yún)?shù)closure7()// 從第 n 個(gè)參數(shù)開始綁定閉包參數(shù) ,// 注意調(diào)用了 curry / ncurry / rcurry 方法后 , 之前的默認(rèn)值就覆蓋了// 此時(shí)第一個(gè)參數(shù)沒有值了// 調(diào)用時(shí) , 必須傳入第一個(gè)參數(shù)只才可以def closure8 =closure5.ncurry(1, "Kotlin")// 閉包的第一個(gè)默認(rèn)值被取消 , 此時(shí)必須傳入第一個(gè)參數(shù)的值才能執(zhí)行該閉包// 否則報(bào)錯(cuò)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ù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的【Groovy】闭包 Closure ( 闭包参数绑定 | curry 函数 | rcurry 函数 | ncurry 函数 | 代码示例 )的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Groovy】闭包 Closure (
- 下一篇: 【Groovy】闭包 Closure (