Java Lambda語法

2018-03-13 10:20 更新

Java Lambda語法


使用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ù)接口中定義。


顯式和隱式lambda表達(dá)式

未聲明其參數(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é)果。


例2

這里是沒有使用類型的演示。當(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é)果。

省略參數(shù)類型

我們可以選擇省略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é)果。

單參數(shù)

對(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é)果。

無參數(shù)

對(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é)果。

final修飾符

您可以在參數(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á)式主體

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é)果。

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)