函數式編程
很多開發語言都開始支持函數式編程,其中最具備代表性的就是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();
}
});
}
}