java8新特性之一lambda

2021-09-01 08:42:56 字數 1656 閱讀 8837

lambda結合函式式介面使用,函式式介面(functional inte***ce)就是乙個有且僅有乙個抽象方法,但是可以有多個非抽象方法的介面。
1 可選型別宣告

不需要宣告引數型別,即直接可以寫引數,不需要宣告型別,編譯器可以自動識別型別

2 可選的引數圓括號

乙個引數可以不要圓括號,多個引數需要圓括號

3 可選的大括號

在實現方法中,主體如果只有乙個語句,可以不用寫大括號,類似於if…else…的,可以不用寫大括號

4 可選的返回關鍵字

如果主體返回值只有乙個表示式,編譯器會自動變異返回值,大括號能可以指明返回的型別

1 省略引數型別,返回值為5

() -> 5

2 省略引數型別,返回值用到引數

(x) -> 2*x

3 新增引數型別

(int x,int y)-> x+y

4 返回值可以為void

(string str) -> system.out.print(str)

package com.fxs.lambda;

public class test ;

system.out.println(test31.count(2,3));

//可以沒有返回值

test4 test4 = (s)-> system.out.println(s);

test4.count("測試無返回值"); }

}//函式式介面,有且只有乙個抽象方法

@functionalinte***ce

inte***ce test1

inte***ce test2

inte***ce test3

inte***ce test4

lambda 表示式只能引用標記了 final 的外層區域性變數,這就是說不能在 lambda 內部修改定義在域外的區域性變數,否則會編譯錯誤。

inte***ce test5

//變數域 ,注意點1

final int num =1;

test5 test5 = (x) -> x + num;

system.out.println(test5.count(2));

//num = 2; //把注釋放開會報錯,因為lambda表示式中用到num,如果num做修改,test5的實現類就不明確,編譯錯誤,必須定義為final

//變數域,注意點2

int num1 =1;

test5 test51 = (x) -> x + num1;

system.out.println(test5.count(2));

//num1 = 2;//lambda 表示式的區域性變數可以不用宣告為 final,但是必須不可被後面的**修改(即隱性的具有 final 的語義)

//lambda 表示式的區域性變數可以不用宣告為 final,但是必須不可被後面的**修改(即隱性的具有 final 的語義)

//變數域,注意點3

//string str="變數名不可重複";//注釋放開會報錯,因為區域性變數str和lambda中的引數名str一樣會報錯

test4 test4 = (str) -> system.out.println(str);

菜鳥教程資料

Java8 新特性 方法引用 一

package cn.com.zq.demo03.reference.test03.reference 方法引用 練習 使用系統已經存在的 方法 進行引用 為什麼要有方法引用?主要是對lambda表示式的優化 當 中 已經存在 對應的類 對應的物件 對應的this 對應的super 的時候 我們可以...

JAVA8新特性Stream學習中

stream是資料渠道,用於運算元據源 集合,陣列等 所生成的元素序列。集合講的是資料,流講的是計算 注 stream自己不會儲存元素 stream不會改變源物件。相反,他們會返回乙個持有結果的新的stream stream操作是延遲執行的。這意味著他們會等到需要結果的時候才執行。步驟 建立stre...

java8新特性之介面定義增強

一 介面定義的增強 從jdk1.8開始允許在介面中定義普通方法,使用default和static關鍵字,跟在訪問修飾符之後,兩種的區別是,default定義的普通方法用物件呼叫,static定義的方法用介面名呼叫 inte ce ibook static void study class booki...