javaSE高階篇6——java8新特性詳解
阿新 • • 發佈:2021-08-19
java8新特性
在前面已經見過一些東西了,但是:挖得有坑兒,主要是為了養成獨立思考的習慣
因為:灌入式學習並不好
1、lambda表示式
- lambda表示式是jdk1.8引入的全新語法特性
- 它支援的是:只有單個抽象方法的函式式介面。什麼意思?
- 就是說:這個介面下面只有一個抽象方法是真正屬於自己的( 像那種從Object類裡面繼承過來的不算 ———— 所以這樣嚴格來講:這個接口裡面就只有一個抽象方法是真正屬於自己的
- 什麼時候會用這個東西? ———— 總的一句話是:函式式介面傳參的時候會用( 這句話包含了很多東西,這裡不理解沒事兒,學完了就懂了 )
- 1、簡化匿名內部類
- 以前玩兒匿名內部類的時候不是弄過一點嗎,回顧一下
-
package cn.xieGongZi.reviewInnerClass; import java.util.TreeSet; // 回顧一下以前玩匿名內部類 public class Demo { public static void main(String[] args) { // 以前在treeSet中研究過它的底層排序原理,所以再來玩兒一下 TreeSet<Integer> treeSet = new TreeSet<>(); treeSet.add(20); treeSet.add(
來嘛:改變排序規則
-
package cn.xieGongZi.reviewInnerClass; import java.util.Comparator; import java.util.TreeSet; // 回顧一下以前玩的匿名內部類 public
這樣雖然是把排序規則改變了,但是不麻煩嗎?
- 所以:lambda表示式來了————再來回顧一下lambda的表示式是怎麼樣的?
- 【 函式式介面】 物件名 ( 引數 )-> { 集合體( 業務程式碼 )} ———— 那再來玩兒一下
-
package cn.xieGongZi.reviewInnerClass; import java.util.TreeSet; public class UseLambda { public static void main(String[] args) { // 來吧:改變排序規則 ———— 使用lambda表示式 TreeSet<Integer> treeSet = new TreeSet<>( (o1,o2 )-> { // 1、為什麼這裡寫兩個o1,o2的引數,然後加個{},這個表示式就可以去執行相應的東西 // 即:這個表示式怎麼知道 老衲重寫的是Comparator介面?
效果圖如下:
// 2、另外一個問題:看起來這個o1,o2貌似沒有值吧
// 它不是引數嗎,在這裡看起沒賦值啊,所以最後怎麼可以得出結果?
return o2 - o1; // 改變比較規則————即:業務程式碼 } ); treeSet.add(20); treeSet.add(30); treeSet.add(1); treeSet.add(9); treeSet.add(10); treeSet.add(18); System.out.println(treeSet); } } - 為了解決解決上述程式碼中的問題,來看一下如下程式碼( 順便引申出函式式介面是什麼意思 )
-
package cn.xieGongZi.functionInterface; public class Test { public static void main(String[] args) { // 開始玩兒 test test = new test(); test.doAdd( new TestFunctionInterface() { // 這中間的這一坨就是一個物件嘛 ———— 一個TestFunctionInterface物件 // 這裡面是用了這個物件 去 呼叫了TestFunctionInterface中的add()方法 // 所以結果來了:lambda表示式中有一個物件名,這個物件名就是這裡的TestFunctionInterface的物件 // 引數有沒有值:有,為什麼? // 就是呼叫doAdd()方法的時候不得傳個引數嗎,這裡說的引數是TestFunctionInterface這個物件攜帶進去的 // 攜帶進去之後去了哪裡? ———— 把這個值賦給了重寫的add()方法裡面需要的引數了嘛 // 因此:總結一句話就是lambda表示式就是指:把一段程式碼( 這段程式碼裡面做了一些事情,如:這裡的輸出語句 )傳遞給了某一個函式,從而讓這個函式去執行相關的操作 // 要真正理解lambda表示式,關鍵就是這裡的回撥,就這裡會繞一下 @Override public void add() { // 正常是這麼玩兒的————重寫這個方法 System.out.println("老衲自東土大唐而來....."); } }); // 這裡面doAdd()中是不是需要傳一個TestFunctionInterface型別的引數( 這個引數指向的那個型別,就是他喵說的函式式介面 ) // 在java中是不是函式式介面,會有一個註解來進行說明@FunctionalInterface ———— 這個東西就是一個宣告性的東西而已 } } // 定義一個介面 interface TestFunctionInterface{ // 這裡面只有這一個方法是真正屬於這個介面的 void add(); } class test{ public void doAdd( TestFunctionInterface t ){ t.add(); // 這裡用TestFunctionInterface型別的物件 回撥 TestFunctionInterface中的抽象方法 } }
-
-
- 【 函式式介面】 物件名 ( 引數 )-> { 集合體( 業務程式碼 )} ———— 那再來玩兒一下
- 所以:lambda表示式來了————再來回顧一下lambda的表示式是怎麼樣的?
-
- 以前玩兒匿名內部類的時候不是弄過一點嗎,回顧一下
- 1、簡化匿名內部類