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

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

  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?

 

转载于:https://www.cnblogs.com/flying-snake/p/11343295.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值