Lambda表達式
Lambda是JDK1.8推出的重要新特性。很多開發語言都開始支持函數式編程,其中最具備代表性的就是haskell。
函數式編程和麪向對象編程可以理解爲兩大開發陣營。很多人認爲面向對象的概念過於完整,結構操作不明確。
我們編寫一個簡單的加法程序爲例
- 當我們如果不僅使用
x+y
方法時,比如說想擴展x+y+10
方法時,我們會發現,我們需要像函數重載一樣編寫多個函數。
package www.bit.java;
class Add {
public void add(int x,int y){
System.out.println(x+y);
}
public void add1(int x,int y){
System.out.println(x+y+10);
}
}
public class MyEnum {
public static void main(String[] args) {
Add add = new Add();
add.add(10,20); // 30
add.add1(10,20); // 40
}
}
- 面象對象設計(使用內部類)
package www.bit.java;
interface Add {
void add(int x,int y);
}
public class MyEnum {
public static void main(String[] args) {
Add add = new Add() {
@Override
public void add(int x, int y) {
System.out.println(x+y);
}
};
add.add(10,20);
Add add1 = new Add() {
@Override
public void add(int x, int y) {
System.out.println(x+y+10);
}
};
add1.add(10,20);
}
}
- 函數式編程
package www.bit.java;
interface Add {
void add(int x,int y);
}
interface Mul{
int mul(int x,int y);
}
interface Sub {
int sub(int x,int y);
}
public class MyEnum {
public static void main(String[] args) {
// 方法體只有一行代碼時: (方法參數) -> 具體方法體實現
Add add = (x,y) -> System.out.println(x+y);
add.add(10,20); // 30
// 當方法有返回值時,單行代碼的Lambda表達式可以省略return語句
Mul mul = (x,y) -> x/y;
System.out.println(mul.mul(10,5)); // 2
/*
當方法體有多行代碼時
(方法參數)-> {
...;
...
return 語句;
};
*/
Sub sub = (x,y) -> {
int temp = x*y;
x += 2;
y -= 1;
return temp-x-y;
};
System.out.println(sub.sub(5,4)); // 10
}
}
要想使用函數式編程有一個前提:接口必須只有一個抽象方法。如果存在兩個以上的方法,無法使用函數式編程。
如果現在某個接口就是爲了函數式編程而生的,在定義時只能存在一個方法,因此有一個新的註解@FunctionalInterface
,此註解會檢查該接口中是否只存在一個抽象方法,存在兩個抽象方法以上編譯報錯。
package www.bit.java;
import javax.xml.ws.FaultAction;
@FunctionalInterface // 是一個函數式編程接口,只允許有一個方法
interface Add {
int add(int x,int y); // 這是一個接口,接口中的抽象方法必須由子類覆寫。
}
public class MyEnum {
public static void main(String[] args) {
Add add = (x,y) -> x+y;
System.out.println(add.add(10,20));
}
}
接口增強
- 使用default定義的普通方法,需要通過接口對象來調用。
- 使用static定義的靜態方法,直接使用接口名調用。
interface IInterface {
void test();
default void fun(){
System.out.println("1-----------");
}
static void method() {
System.out.println("2-----------");
}
}
class InterfaceImpl implements IInterface {
public void test(){
System.out.println("3---------------");
}
}
public class Test {
public static void main(String[] args) {
IInterface in = new InterfaceImpl();
in.test();
in.fun();
IInterface.method();
}
}