Java 8中的Lambda表达式

Java 8中最重要的一项更改是实现更快,更清晰的编码,并为函数式编程打开了大门。运作方式如下。在这里插入图片描述
Java于1990年代被设计为一种面向对象的编程语言,当时面向对象的编程是软件开发的主要范例。在出现面向对象程序设计的很早以前,就已经有了诸如Lisp和Scheme之类的函数式编程语言,但是它们的好处在学术界并未得到足够的重视。最近,函数式编程变得越来越重要,因为它非常适合于并发和事件驱动(或“反应式”)编程。这并不意味着面向对象是不好的。取而代之的是,成功的策略是将面向对象的程序设计与函数式编程结合起来。即使您对并发不感兴趣,这也是有道理的。例如,如果语言具有函数表达式的便捷语法,则可以为集合库提供强大的API。
Java 8的主要增强功能是在其面向对象的根中增加了功能性编程构造。在本文中,我将演示基本语法,并研究如何在几个重要上下文中使用它。关键点是:
Lambda表达式是带有参数的代码块。
每当您想在稍后的时间执行代码块时,请使用lambda表达式。
Lambda表达式可以转换为功能接口。
Lambda表达式可以从封闭范围有效访问最终变量。
方法和构造函数引用引用方法或构造函数而不调用它们。
现在,您可以将默认和静态方法添加到提供具体实现的接口。
您必须解决来自多个接口的默认方法之间的任何冲突。
为什么选择Lambdas?
Lambda表达式是您可以传递的代码块,因此可以在以后执行一次或多次。在开始使用语法(或什至是好奇的名字)之前,让我们退后一步,看看您一直在Java中使用过类似代码块的地方。
当您想在单独的线程中进行工作时,可以将工作放入的 run 方法中 Runnable,如下所示:

1个
2
3
4
5
6
7 class Worker实现Runnable {
公共无效run(){
对于(int i = 0; i <1000; i ++)
做工作();
}

}
然后,当您想执行此代码时,可以构造Worker 该类的实例 。然后,您可以将实例提交到线程池,或者保持简单并启动新线程:

1个
2 工人w =新的Worker();
新线程(w).start();
关键是该 run 方法包含要在单独的线程中执行的代码。
考虑使用自定义比较器进行排序。如果要按长度而不是默认字典顺序对字符串进行排序,则可以将一个Comparator 对象传递 给该 sort 方法:

1个
2
3
4
5
6
7 class LengthComparator实现Comparator {
public int compare(String first,String其次){
返回Integer.compare(first.length(),second.length());
}
}

Arrays.sort(strings,new LengthComparator());
该 sort 方法会不断调用该 compare 方法,如果元素顺序混乱,则将它们重新排列,直到对数组进行排序为止。您为该sort 方法提供了 一个比较元素所需的代码片段,并且该代码已集成到其余的排序逻辑中,您可能不希望重新实现它们。请注意,Integer.compare(x, y) 如果x 和y 相等,调用将返回零;如果和,则调用 将返回负数;如果和, 则返回 x < y正数 x > y。该静态方法已添加到Java 7中。您不应进行计算 x - y 以进行比较 x , y因为该计算可能会在符号相反的大型操作数上溢出。
作为延迟执行的另一个示例,请考虑按钮回调。您将回调操作放入实现侦听器接口的类的方法中,构造一个实例,然后使用按钮注册该实例。这种情况经常发生,以至于许多程序员使用“匿名类的匿名实例”语法:

1个
2
3
4
5 button.setOnAction(new EventHandler (){
公共无效句柄(ActionEvent事件){
System.out.println(“感谢点击!”);
}
});
重要的是handle 方法中的代码 。只要单击该按钮,就会执行该代码。
由于Java 8将JavaFX定位为Swing GUI工具包的后继产品,因此在这些示例中使用JavaFX。(有关 JavaFX的更多信息,请参见 Eric Bruno的帖子。— Ed。)细节并不重要。在每个用户界面工具包(无论是Swing,JavaFX还是Android)中,都为按钮提供了一些您希望在单击按钮时运行的代码。
在所有三个示例中,您看到了相同的方法。代码块已传递给某人-线程池, sort方法或按钮。该代码在以后的某个时间被调用。
到目前为止,在Java中给某人一段代码并不容易。您不能只传递代码块。Java是一种面向对象的语言,因此您必须构造一个对象,该对象属于具有所需代码的方法的类。
在其他语言中,可以直接使用代码块。Java设计人员长期以来一直拒绝添加此功能。毕竟,Java的强大优势在于其简单性和一致性。如果一种语言包含的所有功能都能产生稍微更简洁的代码,那么它就可能变得难以维护。但是,在其他语言中,产生一个线程或注册一个按钮单击处理程序不仅容易。它们的大量API更简单,更一致且功能更强大。在Java中,可能已经编写了类似的API,这些API带有实现特定功能的类的对象,但是此类API使用起来不愉快。
一段时间以来,问题不是针对功能编程是否扩充Java,而是如何做到这一点。经过数年的试验,终于出现了一种非常适合Java的设计。在下一节中,您将看到如何使用Java 8中的代码块。
Lambda表达式的语法
再次考虑前面的排序示例。我们通过代码检查一个字符串是否比另一个短。我们计算

1个 Integer.compare(first.length(), second.length())
什么是第一和第二?他们都是弦!Java是一种强类型语言,我们还必须指定它:

1个
2 (String first, String second)
-> Integer.compare(first.length(), second.length())
您刚刚看到了第一个lambda表达式!这样的表达式只是一个代码块,以及必须传递给代码的所有变量的说明。
为什么叫名字?许多年前,在没有任何计算机之前,逻辑学家阿隆佐·丘奇(Alonzo Church)希望形式化对数学函数进行有效计算的含义。(奇怪的是,有些函数已知存在,但是没人知道如何计算它们的值。)他使用希腊字母lambda(λ)标记参数。如果他知道Java API,他会写:

1个 λfirst.λsecond.Integer.compare(first.length(), second.length())
为什么字母λ?教会是否用完了其他字母?实际上,古老的Principia Mathematica 使用used口音来表示自由变量,这启发了Church使用大写lambda(Λ)作为参数。但是最后,他切换到了小写版本。从那时起,带有参数变量的表达式就被称为“ lambda表达式”。
最后,开发这么多年我也总结了一套学习Java的资料与面试题,如果你在技术上面想提升自己的话,可以关注我,私信发送领取资料或者在评论区留下自己的联系方式,有时间记得帮我点下转发让跟多的人看到哦。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值