JDK8学习笔记(二)深识lambda表达式

       通过上一篇JDK8学习笔记(一)初识lambda表达式 我们jdk8中的lambda表达式有一一个初步认识,这一篇文章是对lambda表达式的一些细节再做些学习。现在我们可以知道,lambda表达式是替换函数式接口出现的地方,是把一个行为参数化了,或者说方法的某个参数(这个参数是函数式接口)传递了一个行为,是一种更加简洁易懂的写法。

       本篇文章再介绍一些其他关于lambda表达式的其他概念和细节,比如函数描述符,方法引用、lambda表达式是如何类型检查的?lambda表达式类型推断,复合lambda表达式的写法。

1、函数描述符

        函数式接口的抽象方法的签名基本上就是Lambda表达式的签名。我们将这种抽象方法叫作函数描述符。例如,Runnable接口可以看作一个什么也不接受什么也不返回(void)的函数的签名,因为它只有一个叫作run的抽象方法,这个方法什么也不接受,什么也不返回(void)。

        函数描述符也叫lambda表达式签名

        这个Runnable接口的函数描述符就是:()-> void  。还有其他的函数式接口的描述符如下:

         Predicate<T>                   T->boolean

        Consumer<T>                   T->void 
        Function<T,R>                   T->R  

 

2、lambda表达式的类型检查、类型推断

 

 类型检查过程可以分解为如下所示:
  首先,你要找出filter方法的声明。 
  第二,要求它是Predicate<Apple>(目标类型)对象的第二个正式参数。 
  第三,Predicate<Apple>是一个函数式接口,定义了一个叫作test的抽象方法。 
  第四,test方法描述了一个函数描述符,它可以接受一个Apple,并返回一个boolean。  
  最后,filter的任何实际参数都必须匹配这个要求。 
     这段代码是有效的,因为我们所传递的Lambda表达式也同样接受Apple为参数,并返回一个boolean。请注意,如果Lambda表达式抛出一个异常,那么抽象方法所声明的throws语句也必须与之匹配。 

        同一个Lambda表达式就可以与不同的函数式接口联系起来,只要它们的抽象方法签名能够兼容。比如,前面提到的Callable和PrivilegedAction,这两个接口都代表着什么也不接受且返回一个泛型T的函数。 

                 

              特殊void兼容规则的例子:

              // Predicate返回了一个boolean 
             Predicate<String> p = s -> list.add(s); 
             // Consumer返回了一个void  
             Consumer<String> b = s -> list.add(s); 

                  

      

3、方法引用

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一路奔跑1314

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值