Java: 語法糖 -- Lambda

Lambda是Java 8引入的新特性,在Java語法層面,Lambda表達式允許函數(shù)作為一個方法的參數(shù)(函數(shù)作為參數(shù)傳遞到方法中);在具體實現(xiàn)上主要依靠了JVM底層提供的 Lambda相關API (現(xiàn)有語法的封裝 )
注:部分代碼示例和說明是轉(zhuǎn)載使用

Lambda表達式

  • 語法:
    (參數(shù)列表)箭頭操作符 Lambda體
    ( (int) arg1, (String) arg2) -> {..}
    • 參數(shù)類型可選; int, String 可省
    • 參數(shù)列表只含有一個參數(shù)可省略( );
    • Lambda體如果只含有一個語句,則可省略{ },類似于實現(xiàn)了函數(shù)式接口中的方法。

:Lambda表達式可簡化函數(shù)式接口的使用,常與內(nèi)部類對比使用,函數(shù)式接口即有且僅有一個抽象方法的接口;函數(shù)式接口可以顯示地被@FunctionallInterface 所表示。

  • Application:簡化接口使用
public class TestLambda {
public static void main(String[ ] args) {
        // regular invocation
        ICar car1 =new ICarImpl();
        car1.drive();
        // Anonymous class
        ICar car2 =new ICar() {  public void drive() { System.out.println("Drive BenzX3"); }
        car2.drive();
        // Lambda
        ICar car3 = ( )-> System.out.println("Drive BenzQ7");
        car3.drive();
        IDriver car4 =(who)->{ System.out.println(who+" is driving");};
        car4.drive("Eli");
        ICleaner car5 = (fare, month) -> fare*month; // (fare,month)->{return fare*month};
        System.out.println("Benz cleaning costs: "+car5.wash(3.8,5));
}
}
interface ICa { void drive( ); }
interface IDriver { void drive ( String driver ); }
interface ICleaner { double wash ( final double fare, int month ); }
class ICarImpl implements ICar{
     public void drive( ) {
           System.out.println("Drive Benz");
     }
}
  • 3 Application:
public static void main(String[] args) {
      ArrayList arr =new ArrayList( );
      arr.add("Eli");
      arr.add("Josh");
      arr.add("Mike");
      arr.forEach( n -> System.out.println(n) );
}

方法引用 --- 更簡約的Lambda表達式

  • 方法引用是Java 8 引入的新特性,可以直接引用已有的Java類或?qū)ο?/em>的方法或構(gòu)造器,相比于Lambda表達式,可以簡化代碼。
  • Lambda表達式可被方法引用代替:Lambda表達式的主體僅包含一個表達式,且該表達式僅調(diào)用了一個已經(jīng)存在的方法。方法引用的通用特性:方法引用中所使用方法的參數(shù)列表和返回值與lambda表達式實現(xiàn)的函數(shù)式接口的參數(shù)列表和返回值一致
public static void main(String[] args) {
      ArrayList arr =new ArrayList();
      arr.add("Eli");
      arr.add("Josh");
      arr.add("Mike");
   // arr.forEach(n-> System.out.println(n));
      arr.forEach(System.out::println);
  // 若arr.forEach( n -> System.out.println(n+1) ); 則不能使用方法引用替換
}

方法引用類型:

注:Function,ConsumerPredicate,Supplier等為Java 8 內(nèi)置的函數(shù)式接口

類型1:方法引用
Class name :: Static Method
Class name :: Instance Method
Instance object :: Instance Method
/**
  *  類名::靜態(tài)方法
  */
// Comparator com = (x,y)-> Integer.compare(x,y);
Comparator com = Integer::compare;
/**
  *  類名:: 實例方法
  */
// Predicate bp = (x,y) -> x.equals(y);
Predicate bp = String::equals;
/**
  *  對象:: 實例方法
  */
// Consumer con = x-> System.out.println(x);
PrintStream out = System.out;
Consumer con = out::println;
類型2:構(gòu)造器引用
Class name :: new
Class name[ ] :: new
/**
*  類:: new
*/
//Supplier supplier = () -> new String();
Supplier supplier = String::new;
類型3:數(shù)組引用
Type :: new
/**
*   數(shù)組類型:: new
*/
//Function fun = x -> new String[x];
Function fun = String[]::new;
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內(nèi)容