1. 程式人生 > >JDK8新特性Lambda表示式的使用與介紹

JDK8新特性Lambda表示式的使用與介紹


JDK8——Lambda表示式

開始之前我們先介紹一下“函數語言程式設計”,什麼是“函數語言程式設計”,就是把一個方法或者一個函式作為引數傳遞,這在JDK8之前是做不到的,但是我們也許經常在 javascript 中看到這樣的操作,如下:

<script type="text/javascript">
	window.onload = test();
	function test() {
		setInterval(function(){
			console.log("執行匿名函式——" + new Date());
		},1000);
		setInterval(() => {
			console.log("執行箭頭函式");
		}, 1000);
	}
</script>

這段JS程式碼中,第一個setInterval函式會每隔1秒執行引數中傳遞的匿名函式,第二個setInterval函式同理,這也是ES6中的箭頭函式,即馬上要學習的Lambda表示式

 

JDK8的Lambda表示式

以比較器為例:

public class TestLambda {

	@Test
	public void testLambda() {
		List<Integer> nums = new ArrayList<>();
		nums.add(8);
		nums.add(3);
		nums.add(5);
		nums.add(1);
		nums.add(7);
		nums.add(6);

		// 傳統匿名內部類的方式
		Collections.sort(nums, new Comparator<Integer>() {

			@Override
			public int compare(Integer i1, Integer i2) {
				return i1 - i2;
			}

		});

		System.out.println(nums);

	}
}

傳統排序器輸出結果:[1, 3, 5, 6, 7, 8]

這裡我們使用傳統的匿名內部類的方式,傳一個排序器物件進去排序。可以看出來我們java的面向物件的思想,實質還是物件的傳遞。

 

使用Lambda表示式改造上面的程式碼

public class TestLambda {

	@Test
	public void testLambda() {
		List<Integer> nums = new ArrayList<>();
		nums.add(8);
		nums.add(3);
		nums.add(5);
		nums.add(1);
		nums.add(7);
		nums.add(6);

		// Lambda表示式書寫比較器
		Collections.sort(nums, (i1,i2)->{ return i1-i2; });

		System.out.println(nums);

	}
}

Lambda表示式書寫排序器輸出結果:[1, 3, 5, 6, 7, 8]

Lambda表示式只能表示函式介面函式介面就是隻有一個方法的介面,例如Runnable介面,Comparator介面等。

Lambda表示式語法

如:(i1,i2)->{ return i1-i2; }

( )開頭,( )中寫函式介面的方法形參名,然後寫 -> 箭頭符 ,最後一個{ },{ }中寫程式碼塊

注意:如果函式介面中的方法有引數,並且引數型別不是泛型,那麼()中直接寫引數名,

            如果函式介面中的方法引數型別是泛型,那麼()中需要指明型別,如(Integer i)