Lambda表达式入门
当前位置:点晴教程→知识管理交流
→『 技术文档交流 』
导读 1、前言 2、Lambda类型 3、Lambda的域以及访问限制 4、内置函数式接口 5、方法引用 6、静态方法引用 7、实例方法引用 8、对象方法引用 9、构造方法引用 10、总结
一、前言 上一篇介绍了lambda表达式的语法,今天继续介绍。
二、Lambda类型 Lambda表达式可以被当做是一个Object。Lambda表达式的类型,叫做“目标类型(target type)”。Lambda表达式的目标类型是“函数接口(functionalinterface)”。 有一个接口,如果只有一个显式声明的抽象方法,那么它就是一个函数接口。一般用@Functionallnterface标注出来(也可以不标)。 举例如下:
我们看到最后的Comparator接口,声明了两个方法,好像不符合函数接口的定义,但Comparator确实是函数接口。这个是因为equals方法是Object的,所有的接口都会声明Object的public方法(虽然大多是隐式的)。所以,Comparator显式的声明了equals不影响它依然是个函数接口。 虽然Lambda虽然可以当作是Object类型,但需要显式转换才行。 我们可以用一个Lambda表达式为一个函数接口赋值:
然后再赋值给一个Object:
但却不能这样干:
必须显式的转型成一个函数接口才可以:
-个Lambda表达式只有在转型成一个函数接口后才能被当做Object使用。所以下面这句也不能编译:
必须先转型:
我们可以定义一个无参数,无返回值的接口,类似Runnable
那下面的写法,都是正确的
这说明一个Lambda表达式可以有多个目标类型(函数接口),只要函数匹配成功即可。 但需注意一个Lambda表达式必须至少有一个目标类型。
三、Lambda的域及访问限制 域即作用域,Lambda表达式中的参数列表中的参数在该Lambda表达式范围内(域)有效。 在作用Lambda表达式内,可以访问外部的变量:局部变量、类变量和静态变量,但操作受限程度不一。 1、访问局部变量 在Lambda表达式外部的局部变量会被JVM隐式的编译成final类型,因此只能访问外而不能修改。 2、访问静态变量和成员变量 在Lambda表达式内部,对静态变量和成员变量可读可写
四、内置函数式接口 小伙伴们有没有发现,如果使用Lambda表达式,还是需要我们自己写一个接口定义的,其实很多接口无非是入参类型和返回值不一样而已,所以Java给我们提供了几个常用的标准函数接口: Consumer<T>con 消费型接口: void accept(Tt); Supplier<T>sup 供给型接口: Tget(); Function<T,R>fun 函数型接口: R apply(Tt); Predicate<T>: 断言型接口:boolean test(Tt); 1、Consumer<T>消费型接口 接口中的方法为 void accept(Tt),1个参数,无返回值。调用方要传入值,而不需要返回,形象比喻成消费型 这个就是对传入num参数值,进行相关的处理(消费)。到底进行处理,具体就在
上面的代码中,是一个典型的1个参数,无返回值的消费;如果没有内置的函数接口,那我们就需要自己定义一个,如:
我们发现和内置函数接口,没有什么区别,就是接口名和方法名称不一样而已,其实本质是一样的,这就是为什么Java会提供一些内置的函数,这样可以减少大量的代码。 2、Supplier<T>供给型接口 接口中的方法Tget(),无参数,有返回值;不需要对方给参数,而是一直返回给对方,形象定义为供给型接口 上面代码就是返回一个新的实体对象。 3、Function<T, R>函数式接口
接口实现转换成大写的字符。 4、Predicate<T>断言型接口
内置的函数接口,大大的提高开发的效率,减少了开发代码
五、方法引用 方法引用是Lambda表达式的一个简化写法其语法结构为 ObjectRef::methodName 左边可以是类名或者实例名,中间是方法引用符号“::”,右边是相应的方法名。方法引用可以分为三类。 使用前提:Lambda体中调用方法的参数列表和返回值类型,要和函数式接口中抽象方法的参数列表和返回值类型保持一致。
六、静态方法引用 先上一个案例 上面的代码中,我们发现Converter匿名类重载方法中,调用了ReferenceTest的静态方法String2Int。再有函数接口的方法参数类型 和 返回值类型,跟String2Int是一样的,入参为String,返回值为Integer。那我们这个时候可以简化成 直接用静态方法进行赋值,是不是很简洁。
七、实例方法引用 如果函数式接口的实现恰好可以通过调用一个实例的实例方法来实现,那么就可以使用实例方法引用
八、对象方法引用 抽象方法的第一个参数类型刚好是实例方法的类型(函数式接口的抽象方法必须要有输入参数)抽象方法剩余的参数恰好可以当做实例方法的参数。
九、构造方法引用 如果函数式接口的实现恰好可以通过调用一个类的构造方法来实现,那么就可以使用构造方法引用,语法【类名::new】 上面是无参数的构造函数,再来看看有参构造函数 到这里,来个方法引用的总结:
十、总结 Lambda表达式要熟练掌握,是要小伙伴们经常去写,才能够运用自如,代码虽然比较简洁,但确实没有接触的开发人员看上去,就懵逼了,可读性不强。 阅读原文:https://mp.weixin.qq.com/s/QhjAC15Y1w0evnRFu8BgDw 该文章在 2025/2/25 17:11:33 编辑过 |
关键字查询
相关文章
|