關於函數式接口的傳參方式


關於函數式接口的傳參方式,目前了解到的就只有兩種(還有的話后續繼續添加):

  1. 面向對象方式
  2. 函數式方式

以 Consumer 與 IntConsumer 為例,先定義兩個接口的實例對象:

1 Consumer consumer = i -> System.out.println(i + "aaa");
2 IntConsumer intConsumer = i -> System.out.println(i * 10);

注:Consumer 與 IntConsumer 之間不存在繼承關系,IntConsumer 只是 Consumer 的一個原生特化版本!

然后定義一個測試方法,接收一個 Consumer 類型的參數

1     private static void test(Consumer<? super Integer> consumer) {
2         consumer.accept(10);
3     }
  • 傳統面向對象的方式,直接將對象的引用傳進去
1 test(consumer);
  • 函數式方式,將函數式接口中唯一的方法,通過方法引用的方式,將定義的 lambda表達式 傳入
1 test(consumer::accept);
2 test(intConsumer::accept);

傳入的是定義的表達式,而非實例的引用

注:若方法定義的參數沒有限定類型為 "? super Integer",那么傳入intConsumer::accept時將會報錯

最后:留一個待解決的點

java.util.Spliterator 類 668 行的 tryAdvance() 方法

 1     default boolean tryAdvance(Consumer<? super Integer> action) {
 2             if (action instanceof IntConsumer) {
 3                 return tryAdvance((IntConsumer) action);
 4             }
 5             else {
 6                 if (Tripwire.ENABLED)
 7                     Tripwire.trip(getClass(),
 8                                   "{0} calling Spliterator.OfInt.tryAdvance((IntConsumer) action::accept)");
 9                 return tryAdvance((IntConsumer) action::accept);
10             }
11         }

傳入怎么樣的 Consumer,才能第一個判斷條件的結果為 true?

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM