关于函数式接口的传参方式

关于函数式接口的传参方式,目前了解到的就只有两种(还有的话后续继续添加):

  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?

 

posted @ 2019-08-12 23:27  飞蛇在水  阅读(1797)  评论(0编辑  收藏  举报