Ø 基礎講解
Lambda表達式是一種基於函數的編程語言,下面我們來演示一下java8中lambda表達式的運用,根據例子來分析一下java8中lambda表達式的改進。
新建一個項目,這個項目必須是基於java8的,我使用的IDE編輯器是idea,故而配置idea的jdk環境爲java8,配置如圖:
我們先來看一下傳統的寫法:
第一種實現方式
interface Message{
public void print(String str);
}
public class TestDemo {
public static void main( String[] args ) {
/**
* 使用的是匿名內部類的方式
*/
Message msg = new Message() {
@Override
public void print( String str ) {
System.out.println(str);
}
};
msg.print("hello world!");
}
}
我們用lambda表達式再來進行書寫呢?
interface Message{
public void print(String str);
}
//定義一個統一的接口
public class TestDemo {
public static void main( String[] args ) {
/**
* 使用lambda表達式的方式
*/
Message msg=(s)-> System.out.println(s);
msg.print("hello world!");
}
}
我們會發現代碼明顯減少了好多,那麼這些代碼怎麼理解呢?
詳解一下吧:
(s)->System.out.println(s)
(語法結構:參數,名稱隨意->方法體)
S-------是一個參數,這個參數名稱是可以隨意起的,但是有一定的要求,那就是必須與接口Message定義的print方法的參數類型一致,但是此處是可以進行聲明也可以不聲明,追求完美度高的用戶可以進行聲明。
寫法: Message msg=(String s)-> System.out.println(s); lambda表達式
->: 是一個固定的寫法,表示的方法指向方法體
方法體:就是在進行早期匿名內部類實現方法的時候所編寫的方法體代碼。
在使用lambda表達式的時候有一個最爲重要的定義要求,那就是接口裏面的方法只能存在一個。使用lambda表達式爲了直接能夠找到對應的方法,只能是定義一個。
特別需要注意的是:
1、 lambda表達式最重要的目的是解決匿名內部類的問題;
2、 想要使用lambda表達式,那麼必須以接口爲主,而且接口裏面只能夠定義一個抽象方法。
Ø 示例說明
比如我們以實現runnable()接口爲例來進行說明
import java.text.MessageFormat;
/**
* Created by xiaona on 2016/5/29.
*/
public class TestRunnable {
public static void main( String[] args ) {
new Runnable() {
@Override
public void run() {
System.out.println("匿名內部類實現Runnable方法");
}
}.run();
/**
* 使用lambda表達式進行實現
*/
int i=1;
Runnable r=()->{
System.out.println("用lambda實現Runnable方法");
System.out.println(MessageFormat.format("i={0}", i));
};
r.run();
}
}
除了像這樣接口似得實現,我們也可以自己定義一個匿名內部類實現登錄操作,同樣是可以進行實現的
public class TestAction {
public static void main( String[] args ) {
new Action(){
@Override
public void execute( String content ){
System.out.println(content);
}
}.execute("java8之前實現的登錄的操作");
Action login=(content)-> {System.out.println(content);};
login.execute("java8實現的登錄操作");
}
static interface Action{
void execute(String content);
}
}
細心的我們會發現,使用lambda表達式與匿名類的不同在於不僅僅是代碼變得簡潔了,還有就是匿名類編譯完畢的class文件是有$符號,而使用lambda表達式是沒有的。