JDK8-lambda表示式以及介面可以定義預設方法
一、Lambda表示式
1、Lamdba
Lambda 允許把函式作為一個方法的引數,使用Lamdba可以讓開發的程式碼更加簡潔,但是易讀性差,新人不瞭解Lamdba表示式或者程式碼功底有點差,不容易讀懂大佬們寫的程式碼了。
2、Lamdba語法格式
(parameter1,parameter2.....) -> {expression;};
引數可以是多個,也可以是1個,也可以沒有引數,expression 同樣是多個,或者是1個,或者無表示式
簡單例子:
// TODO: 2018/11/19 申明資料型別 NumberInterface addOperate = (int a,int b) -> a + b;//加 // TODO: 2018/11/19 不申明資料型別 NumberInterface subOperate = (a, b) -> a - b;//減 // TODO: 2018/11/19 不申明返回語句 NumberInterface mulOperate = (a,b) -> a * b; //乘 // TODO: 2018/11/19 申明返回語句 NumberInterface divOperate = (a,b) -> {//除 return a / b; };
NumberInterface = (int a,int b) -> a + b;
這裡我申明瞭一個函式,變數名為addOperate ,函式值等於(int a,int b)-> a + b;
3、NumberInterface
JDK8以後的介面方法可以有方法體。
a、JDK7以前的版本,修改定義的介面之後,需要修改全部實現該介面的類;
b、JDK8以後的版本,我們可以定義有方法體的method,這樣可以相容老版本的程式碼;
c、所以引進的預設方法,目的是為了解決介面的修改與現有的實現不相容的問題。
package com.cn.dl; /** * Created by Tiger on 2018/11/19. * JDK8以後的介面最大的區別就是方法可以有方法體, * 1、JDK7以前的版本,當需要修改介面時候,需要修改全部實現該介面的類 * 2、JDK8以後的版本,我們可以定義有方法體的method,這樣可以相容以前版本的程式碼。 * 3、所以引進的預設方法,目的是為了解決介面的修改與現有的實現不相容的問題。 */ public interface NumberInterface { int numberOperate(int a,int b); // TODO: 2018/11/19 在介面中定義靜態預設方法 static int operate(int numberA,int numberB,NumberInterface nunberInterface){ return nunberInterface.numberOperate(numberA,numberB); } // TODO: 2018/11/19 介面中定義預設方法 default String getMessage(String message){ return "interface"+message; }; }
4、LambdaTest
package com.cn.dl; /** * Created by Tiger on 2018/11/19. */ public class LamdbaTest { public static void main(String[] args) { int numberA = 100; int numberB = 20; // TODO: 2018/11/19 申明資料型別 NumberInterface addOperate = (int a,int b) -> a + b;//加 // TODO: 2018/11/19 不申明資料型別 NumberInterface subOperate = (a, b) -> a - b;//減 // TODO: 2018/11/19 不申明返回語句 NumberInterface mulOperate = (a,b) -> a * b; //乘 // TODO: 2018/11/19 申明返回語句 NumberInterface divOperate = (a,b) -> {//除 return a / b; }; System.out.println("add>>>"+NumberInterface.operate(numberA,numberB,addOperate)); System.out.println("sub>>>"+NumberInterface.operate(numberA,numberB,subOperate)); System.out.println("mul>>>"+NumberInterface.operate(numberA,numberB,mulOperate)); System.out.println("div>>>"+NumberInterface.operate(numberA,numberB,divOperate)); //呼叫NumberInterface中預設方法 InterfaceTest interfaceTest = new InterfaceTest(); System.out.println(interfaceTest.getMessage(" hello")); } }
5、結果
add>>>120
sub>>>80
mul>>>2000
div>>>5
interface hello
6、總結
a、lambda表示式主要為了執行方法型別的介面,避免定義匿名方法,開發更加簡潔;
b、lambda中使用外層的變數,不能在lamdba表示式中修改其值,外層變數可以不是final型別的,但是絕對不可以在lambda表示式中修改外層變數的值。(Variable used in lambda expression should be final or effectively final)
c、lambda不可以定義一個和外層變數名相同的變數,與變數型別無關。(variable ‘i’ is already defined in the scope)
7、其它測試類
a、InterfaceTest
package com.cn.dl;
/**
* Created by Tiger on 2018/11/19.
*/
public class InterfaceTest implements NumberInterface {
// TODO: 2018/11/19 必須重寫介面中申明的方法(沒有方法體)
@Override
public int numberOperate(int a, int b) {
return 0;
}
}
b、ThreadLamdbaTest
package com.cn.dl;
import java.util.concurrent.TimeUnit;
/**
* Created by Tiger on 2018/11/19.
*/
public class ThreadLamdbaTest {
public static void main(String[] args) {
//普通寫法
new Thread(){
public void run(){
try {
TimeUnit.SECONDS.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("general thread");
}
}.start();
System.out.println("general method");
//lamdba寫法
new Thread(()->{
try {
TimeUnit.SECONDS.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("lambda thread");
}).start();
System.out.println("lambda method");
}
}