Java8語法糖之Lambda表達式

Lambda表達式

什麼是 Lambda表達式?

Lambda表達式是Java SE 8中一個重要的新特性。lambda表達式允許你通過表達式來代替功能接口。 lambda表達式就和方法一樣,它提供了一個正常的參數列表和一個使用這些參數的主體(body,可以是一個表達式或一個代碼塊)。 Lambda 表達式(Lambda expression)可以看作是一個匿名函數,一段可傳遞的代碼(將代碼像數據一樣進行傳遞)。可以寫出更簡潔、更靈活的代碼,作爲一種更緊促的代碼風格,使Java語言表達能力得到提升

語法

(parameters) -> expression 或 (parameters) ->{ statements; }
  1. paramaters:類似方法中的形參列表,這裏的參數是函數式接口裏的參數。這裏的參數類型可以明確的聲明
    也可不聲明而由JVM隱含的推斷。另外當只有一個推斷類型時可以省略掉圓括號。
  2. ->:可理解爲“被用於”的意思
  3. 方法體:可以是表達式也可以代碼塊,是函數式接口裏方法的實現。代碼塊可返回一個值或者什麼都不返回,這裏的代碼塊等同於方法的方法體。如果是表達式,也可以返回一個值或者什麼都不返回

例子

無參數無返回值,並且lambda體中只有一條語句,則->左側括號不能省略,右側的{}可以省略

    //無參數無返回值,並且lambda體中只有一條語句,則->左側括號不能省略,右側的{}可以省略
    public static void test1(){
        Runnable r1=new Runnable() {
            @Override
            public void run() {
                System.out.println("run1");
            }
        };
        r1.run();

        Runnable r2=()-> System.out.println("run2");
        r2.run();

    }

有一個參數,並且lambda體中只有一條語句,則->左側括號與右側的{}均可以省略不寫

	public static void test2(){
		Consumer<String> con1 = (e)-> {System.out.println(e);};
		con1.accept("hello Lambda");
		// 如果只有一個參數,參數的括號可以省略
		// 如果lambda表達式體只有一條語句,lambda題的{}也可以省略
		Consumer<String> con2 = e-> System.out.println(e);
		con2.accept("hello Lambda");
	}

有返回值,但是Lambda體中只有一條語句時,則->右側的{}可以省略不寫

	public static void test3(){
        List<Integer> list = Arrays.asList(3,2,1,4,0);
        list.sort((e1,e2)->Integer.compare(e1,e2));
        list.forEach(e-> System.out.print(e + " "));
    }

有兩個以上參數,有返回值,並且Lambda體中有多條語句,()和{}都不能省略

	Comparator<Employee> cmp = (e1, e2)->{
		System.out.println("函數式接口");
		return e1.getAge() - e2.getAge();
	};

lambda表達式參數列表的類型可以省略不寫,因爲JVM編譯器會通過上下文信息進行推演

	Comparator<Employee> cmp = (Employee e1, Employee e2)->{
		System.out.println("函數式接口");
		return e1.getAge() - e2.getAge();
	}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章