JDK8新特性Lambda表示式的使用與介紹
阿新 • • 發佈:2019-01-12
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)