日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

【Java Lambda表达式】Lambda表达式详解、Lambda表达式的等效使用方式、多线程

發布時間:2024/2/28 java 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【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表达式的等效使用方式、多线程的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。