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表达式也是一个匿名的内部类,所以也有同样的特点:
小小细节,体会以下既可。