JAVA和Nginx 教程大全

网站首页 > 精选教程 正文

Java8新特性-详解lambda表达式Stream

wys521 2025-03-12 21:29:13 精选教程 43 ℃ 0 评论

什么是lambda表达式?

可以把Lambda表达式理解为简洁地表示可传递的匿名函数的一种方式:它没有名称,但它有参数列表、函数主体、返回类型,可能还有一个可以抛出的异常列表。

比如说new一个Thread的传统写法如下

那么利用lambda表达式的写法就是

->左边的就是参数列表,->右边的就是函数主体

函数式接口

为什么@FunctionalInterface注解修饰的类只能有一个抽象函数

查看Java8的源码,被@FunctionalInterface修饰的函数叫做函数式接口,例如Predicate,这些类往往只有一个抽象函数,那是因为“Lambda表达式理解为简洁地表示可传递的匿名函数”,直接使用的匿名函数的时候没有指定函数名称,所以,如果有两个及以上抽象函数的时候,虚拟机就不知道你要执行哪个方法了,如上例中Runnable的run()方法,我们参数列表部分只使用了(),并没有声明调用的函数名。

JDK自带的函数式接口都在java.util.function路径下,常用的有

函数式接口使用示例

其他函数式接口使用示例

为什么lambda表达式使用局部变量必须是final的?

lambda表达式主体部分除了使用参数列表的数据,还可以使用lambda表达式外部的局部变量,但是这些局部变量只能声明一次,否则就会报错。

因为lambda表达式主体可看作是匿名内部类,访问外部局部变量是需要final的。从线程的角度来说,就是局部变量是一个线程(假设叫线程A),lambda表达式主体是另外一个线程(线程B),当线程A结束的时候,线程B还要访问线程A的数据,肯定是不行的,所以线程B中的变量实质上不是指向线程A中的变量,而是拷贝了一份出来,所以必须保证拷贝出来的数据是不可以改变的。

方法引用

lambda表达式还有一个非常方便的地方,就是方法引用,可以通过类名::方法名的形式直接使用方法。

例如

复合lambda表达式的用法

lambda表达式还可以链式调用,同时拥有与或非(negate、and和or)的逻辑判断

函数复合

Function函数接口提供了两个方法对数据做连续操作,andThen和compose方法。

andThen方法相当于先执行f函数,再执行g函数。

compose方法相当于先执行g函数,再执行f函数。

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表