• Lambda使用深入解析


    这一次继续对Lambda表达式进行深入,因为它实在太重要了,这次会涉及到java.util.function中的一些新的FunctionalInterface的使用,用它来进一步巩固对Lambda表达式的理解。

    进一步理解FunctionalInterface:

    在java8开篇中就已经对什么是functionalinterface已经做了初步阐述:有唯一一个抽象方法,也可以包含static和default的方法实现,像这样的接口就是具有functional的接口,贴上之前的图复习下:

    这里再来编码写几种形式来对它进行进一步认识:

    验证它是不是很简单,直接加上Annotation注解就知道啦:

    因为这个SmartAdder类有两个抽象方法:一个是父类的int参数的add,还有一个是自身long参数的add,而它不符合只能有一个抽象方法的规定,所以就不是喽。

     

    对于上面的概念再复习一下,比较简单。

    演练java.util.function的Function加深对Lambda的学习的意义:

    在使用系统Function类之前,先来复习一下如何去使用Lambda表达式,以Runnable为例:

    编译运行:

    其实编译器对于匿名的内部类如果支持Lambda表达式会有提醒,如下:

    好了,简单复习之后,下面就正式开始去使用JDK8中提供的非常常用的Function的接口,为之后JAVA8中的Streams学习做下铺垫,重在体会Lambda表达式的意义。

    ①、Predicate

    也就是传入一个值,最终返回的是一个boolean类型,这里还是以之前过滤苹果为例:

    编译运行:

    在JAVA8有很多跟它类似的类,用法基本差不多,只是可能参数个数或者参数类型不太一样,比如:

    基本是一通百通的,所以这里再用一下它的其它类似的类:

    编译运行:

    下面再来用一下二个参数的Predicate,如下:

    编译运行:

    ②、Consumer

    下面看如何使用?

    编译运行:

    同样的,也有类似的Function,下面也针对性的使用一下,基于上雷同,比较容易:

    编译运行:

    ③、Function

    也就是传入参数T,返回参数R,下面来使用一下:

    编译运行:

    【提示】;貌似在RXJAVA中大量使用到了它,原来它的出处还是在JAVA8的基础之上。

    同样的也是很多类似的Function,下面也对其进行使用一下:

    输出:

    输出:

    ④、Supplier

    输出:

    呃,不就是new了一个apple么,那用这个Supplier有啥意义呢,还整这么麻烦,这个在之后的方法推导中会发现它的用处,这里先提前感受一下:

    呃~~~这语法好像c++的域访问符,这就是之后要学习的方法推导,这里先有个印象。

    小细节:匿名内部类和Lambda表达式body访问变量的问题:

    如果说:

    我们知道对于匿名内部类访问外的变量必须是final类型的,这在android中大量使用到,而如果i++,则说明变量不是final类型,所以内部类的使用时就报错了,

    而Lambda表达式也是一个匿名的内部类,所以也有同样的特点:

    小小细节,体会以下既可。

  • 相关阅读:
    drupal中安装CKEditor文本编辑器,并配置图片上传功能 之 方法二
    drupal 开发笔记
    CSS选择器:子选择符号
    转:Redis和Memcache的区别分析
    转:php 获取memcache所有key
    Fatal error: Namespace declaration statement has to be the very first statement or after any declare call in the script in
    drupal7 boost模块为登录用户提供缓存
    转:drupal使用superfish建立下拉菜单
    RAID详解[RAID0/RAID1/RAID10/RAID5]
    DataV纪录
  • 原文地址:https://www.cnblogs.com/webor2006/p/7707281.html
Copyright © 2020-2023  润新知