您的位置:首页 > 编程语言 > Java开发

Java 8 新特性 Lambda表达式

2015-03-27 13:40 591 查看
     java 1.8新增了Lambda 表达式,这个对于java来说有着颠覆性的意义.使用java1.8 需要使用最新版本的eclipse或者Myeclipse,否则都不支持1.8的编译环境.MyEclipse2015 版下载地址:
http://www.myeclipsecn.com/download/ ;目前没有破解版;

    这一特性的意义:

       1.使java第一次从对象编程迈向函数性编程;

       2.使java不再完全要求强类型,第一次像脚本语言一样,实现了向弱类型的突破;

       3.Lambda表达式适用于单函数接口;

       4.Lambda表达式返回的不是实现函数的返回值;

    还记得当初刚刚开始接触Java,喜欢GUI编程,弄点小游戏,我们经常会碰到这样的情况:

class OriginButton extends Button{
OriginButton(){
this.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
}
});
}
}

    
上面重写了一个Button按钮,我们通过this.addActionListener方法在Button的构造方法中添加了一个事件监听器,

注意ActionListener是一个接口,它里面只有一个actionPerformed(ActionEvent e)的抽象方法,我们每次都需要按照这样的模式.现在有了Lambda表达式以后,我们可以这样写:

class LambdaButton extends Button{
LambdaButton(){
this.addActionListener(
(e) -> System.out.println("")
);
}
}

注意在System.out.println("")后面不要加分号; 
   解释下:

          Lambda表达式要求接口只可以有一个方法,使用Lambda表达式时,不需要方法返回值,不需要参数类型,不需要方法体,不需要类名.

          (e) 表示调用了 public void actionPerformed(ActionEvent e); 方法,该方法只有一个参数,()之外的部分全部被省略,参数类型也被省略,并且返回值已经不再是void,而是 ActionListener的一个匿名对象.

  e 默认类型为ActionEvent,不需要coder自己再去申明. -> 是Lambda表达式的标示符,后面紧接的是接口方法的方法体.
再列举一个类似的例子:

class RunnableDemo{
Runnable run1 = new Runnable(){
public void run(){
System.out.println("");
}
};
Runnable run2 = () -> System.out.println("");
}

run1 是传统的java声明Runnable接口对象的方式.
 run2 是Lambda表达式声明方式. () 代表调用了run()方法,对于无参接口方法,Lambda调用也是无参形式.

接下来.我们自己实现一边Lambda表达式使用全过程:
1.新建一个POJO基本对象(做参数用,可以不要)

class A{
String a;
public String getA(){
return this.a;
}

public String toString(){
return this.a;
}
}


2.新建接口类:

interface LambdaInterface{
public void inte(A a);
}


3.新建测试类:

class LambdaInterfaceTest{

LambdaInterface li1 = new LambdaInterface(){
public void inte(A a){
System.out.println(a);
}
};

LambdaInterface li2 = a -> System.out.println(a);    // 省略括号(多参数时,括号不可省略)

LambdaInterface li3 = (a) -> System.out.println(a);  // 标准模式
LambdaInterface li4 = (A a) -> System.out.println(a);  // 手动声明参数类型为A

LambdaInterface li5 = (a) -> System.out.println(a.getA()); // 弱类型参数,java自动匹配参数类型,不声明类型一样可以调用目标方法

LambdaInterface li6 = (a) -> {         // {} 表示多语句方法体
A b = a;
System.out.println(b);
};
}


 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息