常用编程语言对Lambda表达式的支持

常用编程语言对Lambda表达式的支持

表达式,也称为匿名函数,是一种无需定义名称的函数或子程序objective-c php,在很多高级语言中普遍存在。1958年LISP首先采用匿名函数,发展至今,越来越多的编程语言开始支持该特性,包括C++, PHP等,本文列举了常用的编程语言对表达式的支持,增强对表达式的认识,并了解不同是如何支持表达式的。

Java 8

2013年Java 8的发布,宣布java对表达式的支持,在java支持表达式之前,我们必须这样写代码:

button.addActionListener(new ActionListener() { 
    public void actionPerformed(ActionEvent e) { 
        ui.dazzle(e.getModifiers());
    }
});

你还需要导入java.awt.event.功能接口。而java8带来了表达式,我们只需这样写:

button.addActionListener(e -> { ui.dazzle(e.getModifiers()); });

编译器知道表达式符合void ()方法的定义,看起来实体返回的是void,实际上编译器能推断出参数e的类型就是java.awt.event.。

java 8的表达式的出现主要是大大简化了功能接口的编写,同时java8还提供了java.util.包,包含了很多新的功能接口和迭代方法,这些功能都分成类似于LINQ。

C++ 11

c++ 11也开始支持表达式来,C++ 11的表达式的格式如下:

[capture](parameters) mutable or exception->return-type {body} 

表示一个表达式的开始,这部分是必须的,不能省略。是传递给编译器自动生成的函数对象类的构造函数,只能使用那些定义当前表达式之前所定义的,并且在作用范围内可见的局部变量(包含所在类的this),包含以下形式:

空, 不使用该参数;=。函数体内可以使用所在作用范围内所有可见的局部变量(包括所在类的this),并且是值传递方式(相当于编译器自动为我们按值传递了所有局部变量)。&。函数体内可以使用所在作用范围内所有可见的局部变量(包括所在类的this),并且是引用传递方式(相当于编译器自动为我们按引用传递了所有局部变量)。this。函数体内可以使用所在类中的成员变量。a。将a按值进行传递。按值进行传递时,函数体内不能修改传递进来的a的拷贝,因为默认情况下函数是const的。要修改传递进来的a的拷贝,可以添加修饰符。&a。将a按引用进行传递。a, &b。将a按值进行传递,b按引用进行传递。=,&a, &b。除a和b按引用进行传递外,其他参数都按值进行传递。&, a, b。除a和b按值进行传递外,其他参数都按引用进行传递。

表示重载的()操作符参数,没有参数时,可以省略。参数可以按值(如:(a, b)),也可以按引用(如:(&a, &b))传递参数。

或声明可以省略,按值传递参数时objective-c php,加上修饰符,可以修改参数拷贝的值(修改的是值类型的拷贝)。声明用于指定函数抛出的异常,如抛出整数类型的异常:throw(int)。

“-> -type”,表示函数返回值类型,当没有返回值时,或者函数体内只有一处语句(编译器可以推断出返回值的类型)objective-c php,该部分就可以省略。

{body}表示函数的实现,函数体可以空,当花括号不能省略。

看一个例子,该例子是统计字符串中的大写字母,使用遍历字符串,使用表达式检查字母是否为大写,如果是大学,加1:

int main()
{
    char s[]="Hello World!";
    int uppercase = 0; //modified by the lambda
    for_each(s, s+sizeof(s), [&uppercase] (char c) {
        if (isupper(c))
             uppercase++;
    });
    cout<< Uppercase<<" uppercase letters in: "<< s<

是定义在表达式外的一个变量,并且声明在表达式之前,

中的“&”表示函数体中使用的为一个应用类型,以便更新大写字母的个数。

-C

下面的例子,分别是-C和C++ 11的表达式写法:

^{ printf("Hello, World!n"); } ();

[] { cout << "Hello, World" << endl; } ();

在创建-C的表达式时,在语法上是以“^”开始,而C++ 11是以“”开始。

实际上-C的表达式是构建在C语言之上的,也称为block,是C语言的扩展特性,如果你理解C语言的函数指针,那么有很容易理解-C的block了,只是语法稍微不同。如下一个block的原型:

int (^maxBlk)(int , int);

除了“^”外,是不是和C语言的函数指针的声明一样。上面的示例就是声明一个block原型,名字为,带有两个个int参数,返回值为int类型。

-C有了表达式后,就可以很容易的定义一个满足签名的函数,并且这个函数是匿名的。如下:

maxBlk = ^(int m, int n){ return m > n ? m : n; };

你也可以这样写:

int (^maxBlk)(int , int) = ^(int m, int n){ return m > n ? m : n; };

看如下-C的代码,包含了3给block:

#import 
int (^maxBlk)(int , int) = ^(int m, int n){ return m > n ? m : n; };
int main(int argc, const char * argv[])
{
    ^{ printf("Hello, World!n"); } ();
    int i = 1024;
    void (^blk)(void) = ^{ printf("%dn", i); };
    blk();
    return 0;
}

C#

C#早在2.0版本就引入了匿名方法,简化了我们编写事件处理函数的工作,使我们不再需要单独声明一个函数来绑定事件,只需要关键字就可以编写事件处理代码了。如下:

// Create a handler for a click event
button1.Click += delegate(System.Object o, System.EventArgs e) {
    System.Windows.Forms.MessageBox.Show("Click!"); 
};

而C#3.0再更进一步地推出了表达式,使得编写事件处理函数更加简洁,表达式更新一个计算表达式,使用“=>”符合来连接事件参数和事件处理代码。如:

button1.Click += (o, e) => { System.Windows.Forms.MessageBox.Show("Click!"); };

在C#中,事件处理函数其实就是委托。委托除了可以作为事件处理函数,还可以作为函数指针,或回调函数使用,都可以使用表达式的写法。如:

delegate int del(int i);
del myDelegate = x => x * x;
int j = myDelegate(5); //j = 25

或者:

Func myFunc = x => x == 5;
bool result = myFunc(4); // returns false of cour

另外表达式在LINQ中发挥了重要作用。

PHP 5.3

PHP5.3增加了的支持,对于接受回调函数的PHP函数来说,表达式非常方便。比如使用函数遍历数组,并将回调结果重新赋值给数字各元素。在早期PHP版本中,我们在调用之前常用编程语言对Lambda表达式的支持,必须事先定义好回调函数,比如:

function quoteWords()
{
     if (!function_exists ('quoteWordsHelper')) {
         function quoteWordsHelper($string) {
             return preg_replace('/(w)/','"$1"',$string);
         }
      }
      return array_map('quoteWordsHelper', $text);
}

现在PHP5.3对表达式的支持,使得编码根据简单。如下使用表达式的实现:

function quoteWords()
{
     return array_map('quoteWordsHelper',
            function ($string) {
                return preg_replace('/(w)/','"$1"',$string);
            });
}

世界的表达式根据简单,只是在世界里,表达式主要适用比较小的函数。如普通的函数定义:

def func(x):
    return x * 2
func(2) # 4

使用表达式的写法:

func = lambda x:x*2
func(2) # 4

的表达式常用在一些回调中,比如:

a = [1, 2, 3, 4]
map(lambda x:x**2, a) # output: [1, 4, 9, 16]

或者

a = [1,2,3,4,5,6,7,8,9]
low, high = 3, 7
filter(lambda x:high>x>low, a) # output: [4,5,6]

“x**2″表示x的平方。”high>x>low”等于“high>x and x > low”。

中的表达式通常称为匿名函数,如果你使用过库,那么你肯定知道匿名函数,这里主要作为回调函数使用。比如:

$('#submit').on('click', function(){ functionbody. })

其中方法on的第二个参数就是匿名函数,中的你们函数还有其他存在形式常用编程语言对Lambda表达式的支持,比如:

var func = new Function('x', 'return 2*x;');

或者

var func = function(x) { return 2*x; }

还有就是很多js库常用的方式,表示创建匿名函数,并调用之:

(function(x, y) {
    alert(x+y);
})(2, 3);

总结

表达式的出现简化了编码量,多用于函数回调、事件、匿名函数,并且与闭包的结合使用,更能发挥强大的作用。另外,支持表达式的编程语言有很多,这里主要介绍了我相对熟悉的几种。

【参考】

版权所有,转载请注明出处:

公告:
1. 本站所有资源来源于用户上传和网络,如有侵权请联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系站长处理!
6. 本站不售卖代码,资源标价只是站长收集整理的辛苦费!如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。
7. 站长QQ号码 2205675299

资源库 - 资源分享下载网 » 常用编程语言对Lambda表达式的支持

常见问题FAQ

关于资源售价和售后服务的说明?
本站所有资源的标价均为本站收集资源的辛苦费,不代表资源本身的价值。软件是高智慧高价值的商品,不可能是白菜价。本站资源标价只是赞助费用,收取的赞助费仅用来维持本站的日常运营!毕竟收集整理资料需要投入云计算资源和站长大量的精力。
代码有没有售后服务和技术支持?
由于代码的运行具有不可预见性,本站不保证代码完整可运行,不提供技术支持和售后服务。 本站原创代码都是站长自己开发的,可以有偿提供技术支持服务。 网站里标明【亲测】的代码都是站长亲测过的,其他的代码由于精力有限,没有一一测试,不能保证代码就一定能够使用,更没有技术支持服务,下载前请自行斟酌。
有没有搭建服务?
由于搭建服务比较费时费力,所以本站除了原创代码外均不提供搭建服务。本站分享代码纯属兴趣爱好,不以盈利为目的,请勿咨询有没有搭建服务,谢谢理解。
链接地址失效了怎么办?
请带上资源链接地址联系客服,工作时间内我们看到后将第一时间回复。
关于解压密码
本站资源一般都没有加密,如果发现需要解压密码的,那么就输入 hao.35dc.com 试试。

发表评论

资源库,由老程序员细心甄别、精心筛选,只为提供优质的源码资源

关于我们 联系我们