1. 程式人生 > 其它 >javaSE高階篇6——java8新特性詳解

javaSE高階篇6——java8新特性詳解

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(
          30); treeSet.add(1); treeSet.add(9); treeSet.add(10); treeSet.add(18); System.out.println( treeSet ); // 這是升序排列,那我想降序排列呢? } }

          來嘛:改變排序規則

        • package cn.xieGongZi.reviewInnerClass;
          
          import java.util.Comparator;
          import java.util.TreeSet;
          
          // 回顧一下以前玩的匿名內部類
          public
          class Demo { public static void main(String[] args) { // 來吧:改變排序規則 ———— 重寫comparator介面( 匿名內部類 ) TreeSet<Integer> treeSet = new TreeSet<>(new Comparator<Integer>() { @Override public int compare(Integer o1, Integer 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); } }

          這樣雖然是把排序規則改變了,但是不麻煩嗎?

          • 所以: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中的抽象方法
                      }
                  }