1. 程式人生 > >Lambda表示式語法

Lambda表示式語法

Lambda表示式基本語法

java8中引入了一個新的操作符 -> ,它將lambda表示式,拆分成了引數列表和表示式所需執行的功能(Lambda體)兩部分

其實所謂的Lambda表示式,實際上就是對介面的實現,表示式的引數列表就是介面中抽象方法的引數列表,Lambda體就是抽象方法的實現

  • 無引數、無返回值
new Thread(()->{
    System.out.println("Hello");
}).start();

如果lambda體中之後一行程式碼,則可以省略大括號

new Thread(()-> System.out.println("Hello"
))
.start();
  • 一個引數,無返回值
Consumer<String> consumer = (x)-> System.out.println(x);
consumer.accept("有引數無返回值");
  • 只有一個引數,則可以省略小括號
Consumer<String> consumer = x-> System.out.println(x);
  • 有多個引數,並且Lambda體中有多條語句
Comparator<Integer> com = (x,y)->{
    System.out
.println("多個引數,有返回值"); return Integer.compare(x,y); };
  • 有多個引數,Lambda體中只有一條語句,return和大括號都可以省略
Comparator<Integer> com = (x,y)->Integer.compare(x,y);
  • Lambda表示式的引數列表的資料型別可以省略,JVM編譯器會通過上線文推斷出資料型別,即型別推斷

Lambda表示式需要函式式介面的支援

  • 函式式介面

介面中只有一個抽象方法的幾口,稱為函式式介面。可以使用@FunctionalInterface

修飾,可以檢查是否是函式式介面

內建函式式介面

  1. 消費型介面 Consumer<T> void accept(T t)
  2. 供給型介面 Supplier<T> T get()
  3. 函式型介面 Function<T,R> R apply(T t)
  4. 斷言型介面 Predicate<T> boolean test(T t)

方法引用

如果Lambda表示式中的內容已經存在實現的方法,就可以使用方法引用

方法引用的三種語法格式
  • 物件::物件方法名
PrintStream ps = System.out;
Consumer<String> consumer = ps::println;

或者可以直接寫為

Consumer<String> consumer = System.out::println;
  • 類::靜態方法名
Comparator<Integer> comparator = Integer::compare;
  • 類::物件方法名
BiPredicate<String,String> biPredicate = (x,y)->x.equals(y);

可以寫為

BiPredicate<String,String> biPredicate = String::equals;

1.Lambda表示式中,呼叫方法的引數列表與返回值型別要與函式式介面中抽象方法的引數列表和返回值型別保持一致
2.lambda表達中有兩個引數,如果第一個引數是物件方法的呼叫者,第二個方法是呼叫方法的引數,就可以使用 類::物件方法的方式

構造方法引用

  • ClassName::new
Supplier<String> supplierStr = ()->new String();

可以寫為

Supplier<String> supplierStr = String::new;

需要呼叫的構造方法的引數列表要與函式式介面中抽象方法的引數列表保持一致

陣列引用

Function<Integer,String[]> fun = (x) = new String[x];

可以寫為

Function<Integer,String[]> fun = String[]::new;