用java函數語言程式設計——Lambda表示式
阿新 • • 發佈:2018-11-21
函數語言程式設計
很多開發語言都開始支援函數語言程式設計,其中最具備代表性的就是haskell。函數語言程式設計和麵向物件程式設計可以理解為兩大開發陣營。
在函數語言程式設計中,所有的資料都是不可變的,不同的函式之間通過資料流來交換資訊,函式享有跟資料一樣的地位,可以作為引數傳遞給下一個函式,同時也可以作為返回值。函數語言程式設計的表達方式更加符合人類日常生活中的語法,程式碼可讀性也更強。實現同樣的功能,函數語言程式設計比面向物件程式設計要少程式碼,所以更加容易看懂和理解。
與面向物件程式設計程式碼上的區別(用java演示)
java在jdk1.8之後,推出了lambda表示式,用於函數語言程式設計,操作符為->
看 一段程式碼:
java中利用介面定義一個方法,由匿名內部子類實現,例項化後呼叫。
interface IMessage { void print(); } public class lambda表示式 { public static void main(String[] args) { IMessage message = new IMessage() { @Override public void print() { System.out.println("hello IMessage"); } }; message.print(); } }
實現同樣的功能,用lambda表示式:
interface IMessage {
void print();
}
public class lambda表示式 {
public static void main(String[] args) {
IMessage message = () -> System.out.println("hello IMessage");
message.print();
}
}
這就是lambda表示式基本用法。
總結一下
1、面向物件語法最大的侷限:結構必須非常完整。
2、函數語言程式設計簡單,容易實現,但介面只能有一個方法,不然無法確定覆寫哪個方法。
3、所以有了一個新的註解: @FunctionalInterface,表示這個是函數語言程式設計的介面,如果有2個以上方法就會提示錯誤。
4、語法:(引數)-> {覆寫介面唯一方法的程式碼}
(引數)-> {覆寫介面唯一方法的程式碼}
多行程式碼演示:
interface IMessage {
void print();
}
public class lambda表示式 {
public static void main(String[] args) {
IMessage message = () -> {
System.out.println("hello IMessage1");
System.out.println("hello IMessage2");
System.out.println("hello IMessage3");
};
message.print();
}
}
用處
比如多執行緒Thread覆寫run的時候
public class Test {
public static void main(String[] args) {
//方式一
Runnable runnable = () -> {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
};
Thread thread = new Thread(runnable);
//方式二
Thread thread1 = new Thread(()->{
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
});
}
}