使用lambda表達(dá)式的一般語法是
(Parameters) -> { Body }
->
分隔參數(shù)和lambda表達(dá)式主體。
參數(shù)括在括號(hào)中,與方法相同,而lambda表達(dá)式主體是用大括號(hào)括起來的代碼塊。
lambda表達(dá)式主體可以有局部變量,語句。我們可以在lambda表達(dá)式主體中使用break,continue和return。我們甚至可以從lambda表達(dá)式主體中拋出異常。
lambda表達(dá)式?jīng)]有名稱,因?yàn)樗硎灸涿麅?nèi)部類。
lambda表達(dá)式的返回類型由編譯器推斷。
lambda表達(dá)式不能像方法一樣有throws子句。
lambda表達(dá)式不能是泛型,而泛型在函數(shù)接口中定義。
未聲明其參數(shù)類型的lambda表達(dá)式稱為隱式lambda表達(dá)式。
顯式lambda表達(dá)式是一個(gè)lambda表達(dá)式,它聲明其參數(shù)的類型。
編譯器將推斷用于隱式lambda表達(dá)式的參數(shù)類型
以下代碼使用單一方法創(chuàng)建接口,并將其用作lambda表達(dá)式類型。當(dāng)創(chuàng)建lambda表達(dá)式時(shí),我們聲明參數(shù) s1
的類型為Integer
類型。
public class Main { public static void main(String[] args) { MyIntegerCalculator myIntegerCalculator = (Integer s1) -> s1 * 2; System.out.println("1- Result x2 : " + myIntegerCalculator.calcIt(5)); } } interface MyIntegerCalculator { public Integer calcIt(Integer s1); }
上面的代碼生成以下結(jié)果。
這里是沒有使用類型的演示。當(dāng)忽略類型時(shí),編譯器必須計(jì)算出來。
public class Main { public static void main(String[] args) { MyIntegerCalculator myIntegerCalculator = (s1) -> s1 * 2; System.out.println("1- Result x2 : " + myIntegerCalculator.calcIt(5)); } } interface MyIntegerCalculator { public Integer calcIt(Integer s1); }
上面的代碼生成以下結(jié)果。
我們可以選擇省略lambda表達(dá)式中的參數(shù)類型。
在lambda表達(dá)式 (int x, int y) -> { return x + y; }
聲明的參數(shù)類型。
我們可以安全地重寫lambda表達(dá)式,省略參數(shù)類型
(x, y) -> { return x + y; }
如果我們選擇省略參數(shù)類型,我們必須省略所有參數(shù)的類型。
public class Main { public static void main(String[] argv) { Processor stringProcessor = (str) -> str.length(); String name = "Java Lambda"; int length = stringProcessor.getStringLength(name); System.out.println(length); } } @FunctionalInterface interface Processor { int getStringLength(String str); }
上面的代碼生成以下結(jié)果。
對(duì)于單個(gè)參數(shù)lambda表達(dá)式,我們可以省略括號(hào),因?yàn)槲覀兪÷粤藚?shù)類型。
lambda表達(dá)式 (String msg) -> {System.out.println(msg);}
有一切。
然后我們可以省略參數(shù)類型
(msg)->{System.out.println(msg);}
我們可以進(jìn)一步省略參數(shù)類型和括號(hào),如下所示。
msg -> { System.out.println(msg); }
public class Main { public static void main(String[] argv) { Processor stringProcessor = str -> str.length(); String name = "Java Lambda"; int length = stringProcessor.getStringLength(name); System.out.println(length); } } @FunctionalInterface interface Processor { int getStringLength(String str); }
上面的代碼生成以下結(jié)果。
對(duì)于沒有參數(shù)的lambda表達(dá)式,我們?nèi)匀恍枰ㄌ?hào)。
() -> { System.out.println("hi"); }
以下示例顯示如何使用 BooleanSupplier
。
import java.util.function.BooleanSupplier; public class Main { public static void main(String[] args) { BooleanSupplier bs = () -> true; System.out.println(bs.getAsBoolean()); int x = 0, y= 1; bs = () -> x > y; System.out.println(bs.getAsBoolean()); } }
上面的代碼生成以下結(jié)果。
您可以在參數(shù)聲明中為表達(dá)式lambda表達(dá)式使用 final
修飾符。
以下lambda表達(dá)式使用final修飾符。
(final int x, final int y) -> { return x + y; }
我們可以只使用一個(gè)修飾符如下。
(int x, final int y) -> {return x + y;}
public class Main { public static void main(String[] argv) { Processor stringProcessor = (final String str) -> str.length(); String name = "Java Lambda"; int length = stringProcessor.getStringLength(name); System.out.println(length); } } @FunctionalInterface interface Processor { int getStringLength(String str); }
上面的代碼生成以下結(jié)果。
lambda表達(dá)式主體可以是塊語句或單個(gè)表達(dá)式。
塊語句用大括號(hào)括起來,而單個(gè)表達(dá)式可以沒有大括號(hào)。
在塊語句中,我們可以使用 return
語句返回值。
以下lambda表達(dá)式使用塊語句并使用 return
語句返回總和。
(int x, int y) -> { return x + y; }
下面的lambda使用了一個(gè)表達(dá)式:
(int x, int y) -> x + y
表達(dá)式不需要大括號(hào)。
lambda不必返回值。以下兩個(gè)lambda表達(dá)式只是將參數(shù)輸出到標(biāo)準(zhǔn)輸出,不返回任何內(nèi)容。
(String msg)->{System.out.println(msg);}// a block statement (String msg)->System.out.println(msg) //an expression
例:
public class Main { public static void main(String[] argv) { Processor stringProcessor = (String str) -> str.length(); String name = "Java Lambda"; int length = stringProcessor.getStringLength(name); System.out.println(length);// www . j a va 2 s. co m } } @FunctionalInterface interface Processor { int getStringLength(String str); }
上面的代碼生成以下結(jié)果。
更多建議: