国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Java > 正文

Java8 Lambda表達式詳解及實例

2019-11-26 13:47:30
字體:
來源:轉載
供稿:網友

第一個Lambda表達式

在Lambda出現之前,如果我們需要寫一個多線程可能需要下面這種方式:

Runnable runnable = new Runnable() {      @Override      public void run() {        System.out.println("Hello runnable");      }    };    ... thread.start();

上面的例子如果改成使用Lambda就會簡單許多:

Runnable noArgs = ()->System.out.println("Hello Lambda!~");... thread.start();

Lambda表達式是一個匿名函數,將行為像數據一樣傳遞,表達式使用 -> 將參數和主體分開, -> 前面是參數部分,后面這是主體部分。

Lambda的其它形式

BinaryOperator<Long> add = (x,y)->x+y; //OR BinaryOperator<Long> add = (Long x,Long y)->x+y; //OR BinaryOperator<Long> add = (Long x,Long y)->{  x+y; };
  1. Lambda表達式使用 () 表示沒有參數。
  2. 如果Lambda表達式中只包含一個參數,可省略掉 () 。
  3. 如果Lambda表達式的主題是一段代碼塊,需要使用 {} ,該代碼塊與普通的Java代碼塊并無區別,也可以返回或拋出異常。
  4. 如果參數的類型可以由編譯器推斷得出可以省略參數類型,當然你也可以加上。

以上就是Lambda表達式的所有形式了。

那么問題來了:

BinaryOperator<Long> add = (Long x,Long y)->x+y; 是個什么意思?

這行代碼并不是講個數字相加,而是創建了一個函數,用來計算兩個數字相加的結果。而add的類型是 BinaryOperator<Long> ,它也不是兩個數字的和,而是將兩個數字相加的那段代碼。下面的例子展示如何使用這個變量:

BinaryOperator<Long> add = (Long x,Long y)->x+y; Long res = add.apply(3L, 4L); System.out.println("res="+res);//輸出:res=7

函數接口

函數接口是只有一個抽象方法的接口,用作Lambda表達式的類型。

如 Runnable 就是一個函數接口。

新建一個我們自己的函數接口:

public interface AddOperator<T,D> {  long add(T one,D two);}

使用:

AddOperator<Long,Long> addOperator = ( x, y)->x +y; System.err.println("Custom function listener res= "+addOperator.add(34L, 65L));

目標類型

目標類型是指Lambda表達式所在上下文環境的類型。比如,將Lambda表達式賦值給一個局部變量,或傳遞給一個方法作為參數,局部變量或方法參數的類型就是Lambda表達式的目標類型。

final

       如果我們在匿名內部類中引用了所在方法中的局部變量,這是需要局部變量是 final 的。

在Lambda中我們不需要將引用的外部局部變量聲明為 final 的,但是該變量只能被賦值一次。

下面的例子中如果我們去掉注釋,對name再次賦值,則無法通過編譯,并顯示出錯信息: local variables referenced from a Lambda expression must be final or effectively final.

Lambda表達式引用的局部變量必須是final或即成事實的final。

String name = getUserName();//name="hi";button.addActionListener(event->System.out.println("name="+name));

類型推斷

Lambda表達式的類型推斷是Java7中就引入的目標類型推斷的擴展。

java7中的類型推斷:

List<String> list= new ArrayList<>();

上例中我們并沒有指定ArrayList的范型類型,而是根據list的類型,推斷出了ArrayList的范性類型。

如: AddOperator<Long,Long> addOperator = ( x, y)->x +y;

通過此文,希望能幫助到大家,學習理解,此部分知識,謝謝大家對本站的支持! 

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 桃园县| 盐源县| 交口县| 济南市| 左权县| 石嘴山市| 拜泉县| 喜德县| 会理县| 青阳县| 醴陵市| 蓬安县| 泸州市| 嵩明县| 亳州市| 铜鼓县| 颍上县| 额济纳旗| 广河县| 遂昌县| 富平县| 临湘市| 墨脱县| 左权县| 奈曼旗| 通道| 泉州市| 仪征市| 龙陵县| 抚松县| 天津市| 拜泉县| 闸北区| 揭东县| 南华县| 东港市| 日照市| 平泉县| 平潭县| 嘉定区| 台湾省|