【Java Lambda表达式】Lambda表达式详解、Lambda表达式的等效使用方式、多线程
1、靜態內部類
靜態內部類,屬于類中的類,好處是:如果不使用,就不會被編譯。
如果把這個類放到方法中,成為局部內部類(看下一部分)
package cn.hanquan.test;/*Lambda表達式* 避免匿名內部類定義過多* 簡化線程的使用*/public class Lambda {// 靜態內部類static class Test implements Runnable {@Overridepublic void run() {for (int i = 0; i < 20; i++) {System.out.println("同時偷偷寫著代碼");}}}public static void main(String[] args) {new Thread(new Test()).start();for (int i = 0; i < 20; i++) {System.out.println("一邊嚼口香糖");}} }2、局部內部類
把類放到方法中,成為局部內部類
package cn.hanquan.test;/*Lambda表達式* 避免匿名內部類定義過多* 簡化線程的使用*/public class Lambda {public static void main(String[] args) {// 局部內部類class Test implements Runnable {@Overridepublic void run() {for (int i = 0; i < 20; i++) {System.out.println("同時偷偷寫著代碼");}}}new Thread(new Test()).start();for (int i = 0; i < 20; i++) {System.out.println("一邊嚼口香糖");}} }3、匿名內部類
匿名內部類沒有子類的名稱,只有接口或父類,接上線程體。
匿名內部類必須借助接口或者父類!
接口不能實例化,在后面用花括號表示具體的實現類(體),重寫run方法。
package cn.hanquan.test;/*Lambda表達式* 避免匿名內部類定義過多* 簡化線程的使用*/public class Lambda {public static void main(String[] args) {// 匿名內部類 Runnable是一個接口new Thread(new Runnable() {public void run() {for (int i = 0; i < 200; i++) {System.out.println("同時偷偷寫著代碼");}}}).start();// 普通循環for (int i = 0; i < 200; i++) {System.out.println("一邊嚼口香糖");}} }4、Lambda表達式
JDK8對匿名內部類又進行了簡化:不需要寫Runnable接口,只需要關注傳入什么參數,實現什么操作即可。也就是
將:
new Thread(new Runnable() {public void run() {for (int i = 0; i < 200; i++) {System.out.println("同時偷偷寫著代碼");}}}).start();改為->{花括號內直接寫線程體}:
new Thread(() -> { // ()表示的是函數的參數,這里無參for (int i = 0; i < 200; i++) {System.out.println("同時偷偷寫著代碼");} }).start();以上稱為Lambda表達式,其用于簡化簡單的線程類。
需要注意的是,使用Lambda表達式實現的接口里,只能有一個方法。JDK8會自動推導,比如在本例中,它會知道你的實現體是實現了Runnable接口。
而如果一個接口中有多個方法,則不能這樣使用。
5、一個沒有參數的普通Lambda表達式
package cn.hanquan.test;/*Lambda表達式* 避免匿名內部類定義過多* 簡化線程的使用*/public class Lambda {public static void main(String[] args) {Animal animal = () -> { // ()表示的是函數的參數,這里無參System.out.println("eating~~~");};animal.eat();} }interface Animal {void eat(); }6、含有一個參數的Lambda表達式
注意第9行,這里已經將str外面的括號省略。如果含有多個參數,需要把所有的參數用括號括起來,然后用逗號隔開
其中,參數的類型是可以省略的。比如-> (int a, int b){...} ,或者你也可以寫成簡化版的->(a, b){...}
package cn.hanquan.test;/** 帶參數的Lambda表達式*/public class Lambda {public static void main(String[] args) {Animal animal = str -> { //這里已經將str外面的括號省略System.out.println("eating~~~"+str);};animal.eat("apple");} }interface Animal {void eat(String str); }7、帶返回值的Labmda表達式
package cn.hanquan.test;/** 帶返回值的Lambda表達式*/public class Lambda {public static void main(String[] args) {GetNum n = () -> { // ()表示的是函數的參數,這里無參return 666;};System.out.println(n.myGet());} }interface GetNum {int myGet(); }再簡化
如果整個函數只有一行代碼,連return也可以省略。如下代碼,輸出結果為:5
package cn.hanquan.test;/** 帶返回值的,只有一行的簡化版Lambda表達式*/public class Lambda {public static void main(String[] args) {AddNum n = (a, b) -> a + b;System.out.println(n.calc(2, 3));} }interface AddNum {int calc(int x, int y); }Lambda表達式實質上屬于函數式編程的的概念,上面的代碼,從風格上看,相當于一個ret = a+b的函數。
8、回到最終目的:多線程的簡化
簡化版Lambda表達式在多線程的應用
為了寫一個單行的簡潔版多線程的例子,用了一個while循環套起來,這樣就會不停地開啟新的線程,方便的看到多線程的效果…
后來,內存就溢出了…沒關系,目的達到了。
package cn.hanquan.test;/** 簡化版Lambda表達式在多線程的應用*/public class Lambda {public static void main(String[] args) {while (true) {// 單行代碼可省略Lambda的花括號new Thread(() -> System.out.println("一邊入門,一邊放棄")).start();new Thread(() -> System.out.println("真正的大佬~~~")).start();}} }總結
以上是生活随笔為你收集整理的【Java Lambda表达式】Lambda表达式详解、Lambda表达式的等效使用方式、多线程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Java静态代理】以模拟“婚庆公司帮助
- 下一篇: 【Java多线程】sleep与yield