關於函數式接口的傳參方式,目前了解到的就只有兩種(還有的話后續繼續添加):
- 面向對象方式
- 函數式方式
以 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?