15 使用lambdas和闭包

1       使用lambdas和闭包

1.1  定义闭包

闭包是一个代码块,代替了方法或类。

groovy中的闭包基于后边的构造方式:{list of parameters-> closure body}.其中,-> 之前的值为声明的闭包参数。

如果只有一个变量的时候,可以使用固有变量 it 。

如果没有返回值被定义,则返回-> 后边的值。it 的返回值的用法,参见下例子,


package closures

class ClosuresTest {

static main(args) {

//返回input,使用固有的变量it

def returnInput = {it};

assert "test" == returnInput("test");

//返回input,不使用固有的变量it

def returnInput2 = {s->s};

assert "test" == returnInput2("test");

}

}

1.2  闭包中定义默认值

闭包中,也可以定义参数的默认值。


package closures

class ClosuresDefaultValue {

static main(args) {

def multiply = {int a,int b=10 ->

a*b;

};

assert multiply(2) == 20;

assert multiply(2,5) == 10

}

}

1.3  例子:each方法中使用闭包

在集合中使用闭包的例子,


package closures

class ClosuresEach {

static main(args) {

List<Integer> list = [5,6,7,8];

println ("====自定义变量");

list.each {line ->

print line+",";

};

println ("\r\n====固有变量");

list.each ({

print it+",";

});

println ("\r\n====计算从1到10的和");

def total = 0;

(1..10).each {

total += it;

};

println total;

}

}

1.4  例子:通过string的长度对list排序


package closures

class ClosuresSort {

static main(args) {

def List strings = "this is a long sentence".split();

strings.sort{s1,s2 ->

s1.size() <=> s2.size();

};

println strings;

}

}

输出


[a, is, this, long, sentence]

1.5  使用with方法

每个groovy对象都有一个with 方法,在该方法内,允许调用多个方法或属性,并将所设置的值或执行的方法都应用到该对象中。


package closures

import java.util.List;

class WithObj {

String property1;

String property2;

List<String> list = [];

def addElement(value) {

list << value;

};

def returnProperties() {

"Property 1:$property1,Property 2:$property2";

}

}


package closures

class ClosuresWithMethod {

static main(args) {

def sample = new WithObj();

def result = sample.with {

property1="Input 1";

property2="This is cool";

addElement("Ubuntu");

addElement("Android");

addElement("Linux");

returnProperties();

};

println result;

assert 3==sample.list.size();

assert "Input 1" == sample.property1;

assert "This is cool" == sample.property2;

assert "Linux" == sample.list[2];

def sb = new StringBuilder();

sb.with {

append("this ");

append("is ");

append("appended");

};

println sb;

}

}

输出:


Property 1:Input 1,Property 2:This is cool

this is appended

时间: 2024-10-13 16:46:18

15 使用lambdas和闭包的相关文章

JS 的闭包

1.什么事闭包? 函数嵌套函数,内部函数可以引用外部函数的参数或变量,参数或变量不会被垃圾回收机制所收回,for example: 1 function A() { 2 var a = 1; 3 function B() { 4 alert(a); 5 } 6 return B; 7 } 8 9 var c = A(); 10 c(); 2.闭包有什么好处? 1)变量可以常驻内存 2)避免全局变量的污染 3)私有成员的存在,for example 1 var a = (function(){ 2

JavaScript的闭包详解

(1)定义: 函数内部返回一个函数,返回出来的这个函数叫做被我们称之为闭包(个人理解的最简单的表现形式,) (2)为什么要使用闭包呢? 局部变量在函数执行完之后就会被GC回收,有时候我们想在外部访问内部的变量,这个时候就用到了闭包 (3)闭包有两个作用: a.访问函数内部的变量(函数作为返回值) b.保存作用域(函数作为参数传递) 1 //1.访问函数内部的变量(函数作为返回值) 2 function test(){ 3 var age = 18; 4 return function(){ 5

javascript——闭包

1 <script type="text/javascript"> 2 //什么是闭包: 3 //是指语法域位于某个特定的区域,具有持续参照(读写)位于该区域内自身范围之外的执行域上的非持久型变量值能力的段落. 4 //这些外部执行域的非持久型变量神奇地保留它们在闭包最初定义(或创建)时的值(深连结). 5 //简单来说,闭包就是在另一个作用域中保存了一份它从上一级函数或作用域取得的变量(键值对), 6 //而这些键值对是不会随上一级函数的执行完成而销毁. 7 //周爱民说

php闭包

用个简单的例子开始,有下面个数组: $nums = array(10, 20, 30, 40);需要找出数组中大于 15 的项.那么,不考虑闭包的情况下,我们或许会这样写: $res = array();foreach ($nums as $n) { if ($n > 15) { $res[] = $n; }} 有闭包的支持 $res = array_filter($nums, function($v) { return $v > 15; }); 目前看来感觉都还不错,那么我们再的题目增加点难

Groovy闭包

定义 闭包(Closure)是一种数据类型,它代表一段可执行的代码.它可以作为方法的参数,或者返回值,也可以独立运行,定义如下: def xxx = {parameters -> code}    def xxx = {无参数,纯code} 如我们定义一个名字叫add的闭包,如下: def add = { a, b -> a + b } println("3+5=" + add(3, 5)) 如果闭包没有定义参数,那边它隐含一个参数it,类似Java中的this,假设你的闭

016.Python闭包函数以及locals和globals

一 闭包函数 内函数使用了外函数的局部变量,并且外函数把内函数返回出来的过程叫做闭包,这个内函数叫做闭包函数 1.1 闭包函数语法 def outer(): a = 5 def inner(): print(a) return inner 对比正常的局部变量 局部变量的生命周期最短,在调用结束之后,立即释放. def func(): a = 5 print(a) func() print(a) 执行 1.2 闭包函数的定义 def bibao(): people = "孙仲谋" def

PHP5.3, PHP5.4, PHP5.5新特性

因为用到PHP新版本,一些新特性必须要了解,且有些可以在开发时就使用,如果不使用,那么何必升级PHP版本呢,显得有些得不偿失了! 所以整理了一下 一些特性,有可能不全,待添加 PHP 5.3中的新特性 一.PHP 5.3中的新特性 1. 支持命名空间 (Namespace) 2. 支持延迟静态绑定(Late Static Binding) 3. 支持goto语句 4. 支持闭包.Lambda/Anonymous函数 5. 新增两个魔术方法__callStatic()和__invoke() 6.

自学Python之二 Python中的屠龙刀(续)

函数 秉承着一切皆对象的理念,函数作为对象,可以为其赋值新的对象名,也可以作为参数传递给其他函数! 正常的诸如空函数,默认参数等等我们就不提了,在这里着重提一下默认参数里面的坑和lambda函数. 当默认参数为空list时的坑:定义一个函数,传入一个list,添加一个end后返回 1 >>> def func(l=[]): 2 ... l.append('end') 3 ... return l 4 ... 5 >>> 正常调用是没什么问题的: 1 >>&g

JavaScript高级程序设计: 函数表达式

闭包 闭包是指有权访问另一个函数函数作用域中的变量(内部变量)的函数. function createComparsionFunction( propertyName ){ return function( object1 , object2 ){ var value1 = object1[ propertyName ]; var value2 = object2[ propertyName ]; if( value1 < value2 ){ return -1; } else if( valu