关于函数式接口的传参方式
关于函数式接口的传参方式,目前了解到的就只有两种(还有的话后续继续添加):
- 面向对象方式
- 函数式方式
以 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?