谈谈JAVA中Lambda表达式的使用

一、引例
笔者前段时间看到一道阿里的面试题,题目如下:用代码将int[]转化为Integer[]。我想大部分入门级的小伙伴首先想到的解决办法是new一个Integer[]然后遍历int[]将值塞入Integer[]中实现转换。代码如下:
在这里插入图片描述
这种方法也无可厚非,总归是实现了这样的转换。 但是如果你在面试中写出了如上的代码,那么可能程序还没执行完,你的面试也就over了。事实证明,我们一直在被不断更新的技术持续吊打,but有句话叫做“那些干不死我的,终将会使我变得更加强大”,废话不多说,直接上码如下:
在这里插入图片描述
是不是很神奇,我居然用一行代码就搞定了。上面的代码片段是使用Lambda表达式改写后的代码,简洁之美简直无以言表。那么具体Lambda是如何代替上面for循环中那么一长串代码的呢?它的机制是什么?别急,听我娓娓道来!

二、什么是Lambda表达式
Lambda表达式是Java SE 8中一个重要的新特性。lambda表达式允许你通过表达式来代替功能接口,允许使用更简洁的代码来创建只有一个抽象方法的接口的实例。笔者认为,这就是一种创建匿名实例的语法,这类语法要比匿名内部类创建实例时还要简洁。
Lambda 表达式的目标类型必须是"函数式接口( functional interface ) 。函数式接口代表只包含一个抽象方法的接口 。函数式接 口可以包含多个默认方法、类方法,但只能声明一个抽象方法
如果采用匿名内部类语法来创建函数式接口的实例,则只需要实现 个抽象方法,在这种情况下即可采用 Lambda 表达式来创建对象,该表达式创建出来的对象的目标类型就是这个函数式接口 查询 Java 8的API 文档,可以发现大 的函数式接口,例如: Runnable ActionListener 等接口都是函数式接口。
由于 Lambda 表达式的结果就是被当成对象 因此程序中完全可以使用 ambda 表达式进行赋值,
例如如下代码。
在这里插入图片描述
Runnable是Java 本身提供的一个函数式接口,它只有一个无参的构造方法,因此可以用Lambda表达式创建Runnable的一个对象。

三、方法引用与构造器引用
方法引用和构造器引用可以让 Lambda 表达式的代码块更加简洁 方法引用和构造器引用都需要使用两个英文冒号 Lambda 表达式支持如下表 所示的几种引用方式:
在这里插入图片描述
1.引用类方法
先看第 种方法引用:引用类方法 例如,定义了如下函数式接口:
在这里插入图片描述
该函数式接口中包含 convertO抽象方法,该方法负责将 String 参数转换为Integer 下面代码使用Lambda 表达式来创建一个 Converter 对象,并调用 converter 对象的 convert()方法将字符串转换为整数了,例如如下代码:
在这里插入图片描述
上述通过Lambda表达式创建的convert对象,也可通过引用类方法来代替,代码如下:
在这里插入图片描述
2. 引用特定对象的实例方法
先使用 Lambda 表达式来创建 Converter对象,代码如下:
在这里插入图片描述
上面 Lambda 表达式的代码块只有 行调用 “xiebo” indexOf()实例方法的代码 因此可 使用如方法 用进行替换:
在这里插入图片描述
3. 引用某类对象的实例方法
下面看第三种方法引用 :引 用某类对象的实例方法。 例如, 定义了如下函数式接口:
在这里插入图片描述
该函数式接口中包含 test()的抽象方法,该方法负责根据 String、int、 int三 个参数生 成String返回值。下面代码使用 Lambda 表达式来创建一个MyTest 对象并执行test()方法。
在这里插入图片描述
上面 Lambda 表达式的 码块只有 a.substring(b,c),因此可以使用如下方法引用进行替换。
在这里插入图片描述
4. 引用构造器
下面看构造器引用 例如,定义了如下函数式接口:
在这里插入图片描述
下面使用Lambda表达式来创建一个Constractor对象。
在这里插入图片描述
上面 Lambda 表达式的代码块 new JFrame(title) 可以使用如下构造器引用进行替换:
在这里插入图片描述
同样的Java中Arrays类中也提供了许多函数式接口,如Comparator、 XxxOperator、XxxFunction 等接口的实例,这些接口都是函数式接口,因此可以使用 Lambda表达式来调用Arrays的方法,有兴趣的小伙伴可以自己动手试一试。

发布了1 篇原创文章 · 获赞 0 · 访问量 18

猜你喜欢

转载自blog.csdn.net/xifengchuihaian/article/details/104606688
今日推荐