网站首页 > 技术教程 正文
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
<font style="vertical-align: inherit;"><font style="vertical-align: inherit;">class Worker实现Runnable {</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
公共无效run(){</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
对于(int i = 0; i <1000; i ++)</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
做工作();</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
}</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
...</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
}</font></font>
然后,当您想执行此代码时,可以构造Worker 该类的实例 。然后,您可以将实例提交到线程池,或者保持简单并启动新线程:
1个
2
<font style="vertical-align: inherit;"><font style="vertical-align: inherit;">工人w =新的Worker();</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
新线程(w).start();</font></font>
关键是该 run 方法包含要在单独的线程中执行的代码。
考虑使用自定义比较器进行排序。如果要按长度而不是默认字典顺序对字符串进行排序,则可以将一个Comparator 对象传递 给该 sort 方法:
1个
2
3
4
5
6
7
<font style="vertical-align: inherit;"><font style="vertical-align: inherit;">class LengthComparator实现Comparator <String> {</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
public int compare(String first,String其次){</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
返回Integer.compare(first.length(),second.length());</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
}</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
}</font></font><font></font>
<font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
Arrays.sort(strings,new LengthComparator());</font></font>
该 sort 方法会不断调用该 compare 方法,如果元素顺序混乱,则将它们重新排列,直到对数组进行排序为止。您为该sort 方法提供了 一个比较元素所需的代码片段,并且该代码已集成到其余的排序逻辑中,您可能不希望重新实现它们。请注意,Integer.compare(x, y) 如果x 和y 相等,调用将返回零;如果和,则调用 将返回负数;如果和, 则返回 x < y正数 x > y。该静态方法已添加到Java 7中。您不应进行计算 x - y 以进行比较 x , y因为该计算可能会在符号相反的大型操作数上溢出。
作为延迟执行的另一个示例,请考虑按钮回调。您将回调操作放入实现侦听器接口的类的方法中,构造一个实例,然后使用按钮注册该实例。这种情况经常发生,以至于许多程序员使用“匿名类的匿名实例”语法:
1个
2
3
4
5
<font style="vertical-align: inherit;"><font style="vertical-align: inherit;">button.setOnAction(new EventHandler <ActionEvent>(){</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
公共无效句柄(ActionEvent事件){</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
System.out.println(“感谢点击!”);</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
}</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
});</font></font>
重要的是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)<font></font>
-> 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的资料与面试题,如果你在技术上面想提升自己的话,可以关注我,私信发送领取资料或者在评论区留下自己的联系方式,有时间记得帮我点下转发让跟多的人看到哦。
猜你喜欢
- 2024-10-25 Auto CAD 常用系统变量 cad2020系统变量
- 2024-10-25 做开发十年,我总结出了这些开发经验
- 2024-10-25 Windows高级工程师:GDI/GDI+绘图;基础入门大全
- 2024-10-25 菜比手把手教你破解游戏多开(轻喷)
- 2024-10-25 JVM 完整深入解析 jvm解析阶段
- 2024-10-25 Linux打开的文件过多Too many open file
- 2024-10-25 一文看完Oracle数据库之PGA概念、组成、自动管理、参数及视图
- 2024-10-25 JavaScript 中内存泄漏的原因以及对策
- 2024-10-25 史上最全Oracle文件损坏处理办法(附实验步骤)
- 2024-10-25 C++消息循环GetMessage/TranslateMessage/DispatchMessage
你 发表评论:
欢迎- 01-09单因素方差分析+作图
- 01-09描述性统计分析 之 均值分析
- 01-0986:重复性和再现性分析GRR(2)-GRR均值极差分析法和方差分析法
- 01-09SPC如何做方差分析,意义又在哪里?
- 01-09MedSPSS小课堂——多因素方差分析
- 01-09MedSPSS小课堂——双因素方差分析
- 01-09SPSS单因素方差分析的操作步骤及结果解读,陈老师SPSS数据分析
- 01-0914单因素方差分析:One-Way ANOVA
- 最近发表
- 标签列表
-
- sd分区 (65)
- raid5数据恢复 (81)
- 地址转换 (73)
- 手机存储卡根目录 (55)
- tcp端口 (74)
- project server (59)
- 双击ctrl (55)
- 鼠标 单击变双击 (67)
- debugview (59)
- 字符动画 (65)
- flushdns (57)
- ps复制快捷键 (57)
- 清除系统垃圾代码 (58)
- web服务器的架设 (67)
- 16进制转换 (69)
- xclient (55)
- ps源文件 (67)
- filezilla server (59)
- 句柄无效 (56)
- word页眉页脚设置 (59)
- ansys实例 (56)
- 6 1 3固件 (59)
- sqlserver2000挂起 (59)
- vm虚拟主机 (55)
- config (61)
本文暂时没有评论,来添加一个吧(●'◡'●)