lambda表达式

python

# 定义函数(普通方式)

def func(arg):

    return arg + 1

  

# 执行函数

result = func(123)

   

# 定义函数(lambda表达式)

my_lambda = lambda arg : arg + 1

  

# 执行函数

result = my_lambda(123)


Java

【还不是很懂9-10】

Java8中最重要的特性之一就是引入了lambda表达式。这能够使你的代码更加简练,并允许你将行为传递到各处。

Java8在使世界上最受欢迎的编程语言之一在接纳函数式编程的过程中向前迈了一大步。 为了支持函数式编程,编程语言必须将函数作为第一类对象。 在Java8之前,如果没有使用一个匿名内部类模板是没法写出清晰的函数式代码的。 随着lambda表达式的引入,函数已经成为第一类对象,并能够像其它变量一样被到处传递。

第一类对象(英语:First-class object)在计算机科学中指可以在执行期创造并作为参数传递给其他函数或存入一个变数的实体。 将一个实体变为第一类对象的过程叫做"物件化"(Reification)。

lambda表达式允许你定义一个不与标识符绑定的匿名函数。你可以像编程语言中的其它概念一样使用它们,比如变量的声明。当一个编程语言需要支持高阶函数时,就需要用到lambda表达式。高阶函数是指以其它函数作为参数或者返回函数作为结果的函数。

lambda表达式源自λ演算。λ演算Alonzo Church在将带有函数的符号计算进行公式化时提出。λ演算是具有图灵完备性的,它通过数学形式来展现计算过程。图灵完备性表示你可以通过lambda表达任何的数学计算。

Java8 lambda表达式

在Java8中,我们将使用lambda表达式写出如下的代码。这与我们上面提及过的代码段相同。

sendEmail(() -> System.out.println("Sending email..."));
  •  

上面的展示的代码非常简练,也没有污染程序员想要传递的行为。()用来表示这个lambda表达式没有参数,像Runnable接口中的run方法就没有任何参数。->是将参数和用来打印出Sending email的方法主体分隔开的lambda操作符。

让我再来看看Collections.sort这个例子来了解lambda表达式是如何使用参数的。为了使名字能够按照它们的长度进行排列,我们向排序方法传入了一个Comparator。该Comparator如下所示。

Comparator<String> comparator = (first, second) -> first.length() - second.length();
  •  

我们编写的lambda表达式与Comparator接口中的compare方法相关联。compare方法的签名如下。

int compare(T o1, T o2);
  •  

T是传给Comparator接口的类型参数。由于我们是对一组表示名字的字符串进行操作,所以这个例子中它将是字符串类型的。在lambda表达式中我们不需要特意提供该类型——字符串。javac编译器会从上下文中推断出它的类型信息。由于我们在给一组字符串排序,Java编译器会推测出两个参数都应该是字符串,而compare方法只标明需要T这一种类型。像这样通过上下文推断类型的行为称作类型推断。Java8优化了Java原有的类型推断机制,使得它更具有鲁棒性,并能够更好地支持lambda表达式。javac会在后台寻找与你lambda表达式相关的信息,并使用该信息来找到参数正确的类型。

在大多数情况下,javac会从上下文中推断出类型。如果由于上下文缺失或不完整导致代码不能进行编译,它也就不能推断出类型。例如如果我们将String的类型信息从Comparator中移除,那么代码会像下面一样编译失败。

Comparator comparator = (first, second) -> first.length() - second.length(); // compilaation error - Cannot resolve method 'length()'

lambda表达式是如何在Java8中工作的?

@FunctionalInterface

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值