1. 程式人生 > >Java8新特性(一)---Lambda表示式

Java8新特性(一)---Lambda表示式

Java8新特性之Lambda表示式

Lambda表示式可以簡單的理解為可傳遞的匿名函式的一中方式,它沒有名稱,但它有引數列表、函式主體、返回型別。可以讓我們程式設計更加的方便。
在Java8引入了一個新的基礎語法:就是一個“->”。該操作符稱為箭頭操作符或者Lambda操作符。
箭頭將Lambda表示式拆分為兩個部分

  1. 左側:Lambda表示式的引數列表
  2. 右側:Lambda表示式中所需執行的功能,即Lambda體

Lambda的語法格式

語法格式一:無引數,無返回值
() -> System.out.println("Hello Lambda!");
語法格式二:有一個引數,並且無返回值
(x) -> System.out.println(x)
語法格式三:若只有一個引數,小括號可以省略不寫
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編譯器通過上下文推斷出,資料型別,即“型別推斷”
//即以下程式碼中的“Integer”可以省略
(Integer x, Integer y) -> Integer.compare(x, y);

接下來我將以程式碼演示,在Java8之前沒lambda表示式的樣子,以及有lambda表示式後的變化。

在Java8之前沒有Lambda表示式

public void test1(){
		//最原始:首先自定義一個排序類,再作為引數傳遞給TreeSet
		Comparator<String> com = new Comparator<String>(){
			@Override
			public int compare(String o1, String o2) {
				return Integer.compare(o1.length(), o2.length());
			}
		};
		TreeSet<String> ts = new TreeSet<>(com);
		//優化1:排序類使用匿名物件
		TreeSet<String> ts2 = new TreeSet<>(new Comparator<String>(){
			@Override
			public int compare(String o1, String o2) {
				return Integer.compare(o1.length(), o2.length());
			}
		});
	}

有lambda表示式之後

//現在的 Lambda 表示式
	@Test
	public void test2(){
		TreeSet<String> ts2 = new TreeSet<>((x, y) -> Integer.compare(x.length(), y.length()));
	}

是不是感覺非常的簡潔,也不用寫很多無用的程式碼了。其實我們關注的只是單單那一行。

Lambda表示式

在這裡插入圖片描述

舉例

用Runnable執行程式碼塊
之前

Thread t = new Thread(new Runnable() { 
	 public void run(){ 
	 	System.out.println("Hello world"); 
	 } 
});

之後(用了Lambda表示式)

Thread t = new Thread(() -> System.out.println("Hello world"));

用Comparator進行排序
之前

Comparator<Apple> byWeight = new Comparator<Apple>() { 
 public int compare(Apple a1, Apple a2){ 
 	return a1.getWeight().compareTo(a2.getWeight()); 
 } 
};

之後(用了Lambda表示式)

Comparator<Apple> byWeight =  (Apple a1, Apple a2) -> a1.getWeight().compareTo(a2.getWeight());

在第一次接觸這個lambda表示式時可能感覺會有點彆扭,但是不得不承認,程式碼看起來更清晰了!我們傳遞的只是比較蘋果的重量或者關注的真正需要執行的程式碼。
總的來說,Lambda表示式免去了使用匿名方法的麻煩,給予Java強大的函式化程式設計的能力。