加入收藏 | 设为首页 | 会员中心 | 我要投稿 拼字网 - 核心网 (https://www.hexinwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 教程 > 正文

让代码更精简 细说Java 8 Lambda表达式

发布时间:2017-08-09 06:15:18 所属栏目:教程 来源:核子可乐编译
导读:Java 8中的Lambda表达式给该语言带来了一系列改进。这种新型表达式的出现让一部分代码更易于查看及编写,特别是对于那些能够以函数形式表达的代码而言。Lambda表达式还为Java语言带来更加丰富的表达能力,并使多种操作在运行时当中获得更为高效的执行效果。通

  Java中的匿名内部类

  Java当中的匿名内部类可以算是通往Lambda表达式发展道路上的一种起步模式或者雏形。大家可以轻松对这些类进行联机定义且无需为其设定名称,举例来说:

JButton testButton = new JButton("Test Button"); 
testButton.addActionListener(new ActionListener()
  {@Override public void actionPerformed(ActionEvent ae){ 
     System.out.println("Click Detected by Anon Class");  
     }      
});

  在以上示例中(来自甲骨文发布的官方教程),被添加到按钮中的ActionListener是由actionPerformed方法在匿名内部类中进行定义的,而并非利用经过命名的单独类。虽然这种处理方式能够略微降低代码量,但整体而言表达方式依然啰嗦。

  只定义单独一项方法的接口过去被称为Single Abstract Method(即单独抽象方法)接口,如今在Java 8中则被更名为函数接口。如我们所见,函数接口与匿名内部类通常经由Lambda表达式加以使用。

  Java中的Lambda语法

  正如我们之前所说,C#中的Lambda运算符为=>。而在Java中,Lambda运算符则为-〉。(请大家不要抱怨二者之间的差异。如果语法完全保持一致,那么任何开发者都能够学会使用——这样开发水平的高低将无从体现。)

  与C#中的Lambda表达式类似,Java 8 Lambda表达式当中包含一套参数列表。举例来说,(int x)-> x * x指定了一个名为x且返回值为x平方的整数参数。如大家所见,Java 8 Lambda表达式拥有类型化特性。幸运的是,当该类型能够通过上下文进行推断时,我们就可以将其省略。

  请大家思考以下三种Lambda表达式:

(int x, int y) -> x + y 
() -> 42 
(String s) -> { System.out.println(s); }

  现在看看之前提到过的ActionListener在利用Lambda表达式进行重新编写后是什么样子:

JButton testButton = new JButton("Test Button");
testButton.addActionListener(e -> System.out.println("Click Detected by Lambda Listener"));

  整个表达过程简洁多了,对吧?大家应该还会注意到,由于其中的“e”属于ActionListener的参数,因此它归于“对象类型”子句、而且其类型也能够正确推断得出。

(编辑:拼字网 - 核心网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!