【JDK8 新特性3】常用内置函数式接口

简介: 我们知道使用Lambda表达式的前提是需要有函数式接口。而Lambda使用时不关心接口名,抽象方法名,只关心抽 象方法的参数列表和返回值类型。因此为了让我们使用Lambda方便,JDK提供了大量常用的函数式接口。

我们知道使用Lambda表达式的前提是需要有函数式接口。
而Lambda使用时不关心接口名,抽象方法名,只关心抽 象方法的参数列表和返回值类型。
因此为了让我们使用Lambda方便,JDK提供了大量常用的函数式接口。

它们主要在 java.util.function 包中。下面是最常用的几个接口。
1. Supplier接口
1.png
2. Consumer接口
2.png
3. Function接口
3.png
4. Predicate接口
4.png

1、Supplier接口

java.util.function.Supplier 接口,它意味着"供给" , 对应的Lambda表达式需要“对外提供”一个符合泛型类型的对象数据。
1.png供给型接口,通过Supplier接口中的get方法可以得到一个值,无参有返回的接口。
使用Lambda表达式返回数组元素最大值
使用 Supplier 接口作为方法参数类型,通过Lambda表达式求出int数组中的最大值。

注:接口的泛型请使用 java.lang.Integer 类。

代码示例
5.png

2、Consumer接口

java.util.function.Consumer接口则正好相反,它不是生产一个数据,而是消费一个数据,其数据类型由泛型参数决定。
2.png
使用Lambda表达式将一个字符串转成大写和小写的字符串
Consumer消费型接口,可以拿到accept方法参数传递过来的数据进行处理, 有参无返回的接口。
代码示例:
6.png
默认方法:andThen
如果一个方法的参数和返回值全都是 Consumer 类型,那么就可以实现效果:消费一个数据的时候,首先做一个操作,然后再做一个操作,实现组合。
而这个方法就是 Consumer 接口中的default方法 andThen 。
下面是JDK的源代码:
7.png

注: java.util.Objects 的 requireNonNull 静态方法将会在参数为null时主动抛出
NullPointerException 异常。这省去了重复编写if语句和抛出空指针异常的麻烦。

要想实现组合,需要两个或多个Lambda表达式即可,而 andThen 的语义正是“一步接一步”操作。
例如两个步骤组合的情况:
8.png
运行结果将会首先打印完全小写的hello,然后打印完全大写的HELLO
当然,通过链式写法可以实现更多步骤的组合。

3、Function接口

java.util.function.Function<T,R> 接口用来根据一个类型的数据得到另一个类型的数据,前者称为前置条件,后者称为后置条件。有参数有返回值。
3.png
代码示例:
Function转换型接口,对apply方法传入的T类型数据进行处理,返回R类型的结果,有参有返回的接口。使用的场景:将 String 类型转换为 Integer 类型。
使用Lambda表达式将字符串转成数字
9.png
默认方法:andThen
Function 接口中有一个默认的 andThen 方法,用来进行组合操作。JDK源代码如:
10.png
该方法同样用于“先做什么,再做什么”的场景,和 Consumer 中的 andThen 差不多:
11.png
第一个操作是将字符串解析成为int数字,第二个操作是乘以10。
两个操作通过 andThen 按照前后顺序组合到了一起。

请注意,Function的前置条件泛型和后置条件泛型可以相同。

4、Predicate接口

有时候我们需要对某种类型的数据进行判断,从而得到一个boolean值结果。
这时可以使用java.util.function.Predicate 接口。
4.png
使用Lambda判断一个人名如果超过3个字就认为是很长的名字
对length方法的参数T进行判断,返回boolean类型的结果。用于条件判断的场景:
12.png
条件判断的标准是传入的Lambda表达式逻辑,只要名称长度大于3则认为很长。

4.1 默认方法:and

既然是条件判断,就会存在与、或、非三种常见的逻辑关系。
其中将两个 Predicate 条件使用“与”逻辑连接起来实现“并且”的效果时,可以使用default方法 and 。其JDK源码为:
13.png
如果要判断一个字符串既要包含 掘,又要包含金;
14.png

4.2 默认方法:or

使用Lambda表达式判断一个字符串中包含掘金或者包含6月
与 and 的“与”类似,默认方法 or 实现逻辑关系中的“”。
JDK源码为:
15.png
如果希望实现逻辑“字符串包含掘金或者包含6月”,那么代码只需要将“and”修改为“or”名称即可,其他都不变:
16.png

4.3 默认方法:negate

使用Lambda表达式判断一个字符串中不包含摆烂
“与”、“或”已经了解了,剩下的“非”(取反)也会简单。
默认方法 negate 的JDK源代码为:
17.png
代码演示:
18.png

相关文章
|
1月前
|
Java
让星星⭐月亮告诉你,jdk1.8 Java函数式编程示例:Lambda函数/方法引用/4种内建函数式接口(功能性-/消费型/供给型/断言型)
本示例展示了Java中函数式接口的使用,包括自定义和内置的函数式接口。通过方法引用,实现对字符串操作如转换大写、数值转换等,并演示了Function、Consumer、Supplier及Predicate四种主要内置函数式接口的应用。
25 1
|
2月前
|
容器
jdk8新特性-详情查看文档
jdk8新特性-详情查看文档
45 3
|
1月前
|
存储 安全 Java
JDK1.8 新的特性
JDK1.8 新的特性
19 0
|
2月前
|
编解码 安全 Java
jdk8新特性-接口和日期处理
jdk8新特性-接口和日期处理
|
3月前
|
Oracle Java 关系型数据库
JDK8到JDK29版本升级的新特性问题之未来JDK的升级是否会成为必然趋势,如何理解
JDK8到JDK29版本升级的新特性问题之未来JDK的升级是否会成为必然趋势,如何理解
|
3月前
|
Oracle 安全 Java
JDK8到JDK28版本升级的新特性问题之在Java 15及以后的版本中,密封类和密封接口是怎么工作的
JDK8到JDK28版本升级的新特性问题之在Java 15及以后的版本中,密封类和密封接口是怎么工作的
|
2月前
|
Java 编译器 API
JDK8新特性--lambda表达式
JDK8的Lambda表达式是Java语言的一大进步。它为Java程序提供了更多的编程方式,让代码更加简洁,也让函数式编程的概念在Java中得到了体现。Lambda表达式与Java 8的其他新特性,如Stream API、新的日期时间API一起,极大地提高了Java编程的效率和乐趣。随着时间的流逝,Java开发者对这些特性的理解和应用将会越来越深入,进一步推动Java语言和应用程序的发展。
14 0
|
2月前
|
Java
安装JDK18没有JRE环境的解决办法
安装JDK18没有JRE环境的解决办法
315 3
|
3月前
|
Java 关系型数据库 MySQL
"解锁Java Web传奇之旅:从JDK1.8到Tomcat,再到MariaDB,一场跨越数据库的冒险安装盛宴,挑战你的技术极限!"
【8月更文挑战第19天】在Linux上搭建Java Web应用环境,需安装JDK 1.8、Tomcat及MariaDB。本指南详述了使用apt-get安装OpenJDK 1.8的方法,并验证其版本。接着下载与解压Tomcat至`/usr/local/`目录,并启动服务。最后,通过apt-get安装MariaDB,设置基本安全配置。完成这些步骤后,即可验证各组件的状态,为部署Java Web应用打下基础。
57 1
|
3月前
|
Oracle Java 关系型数据库
Mac安装JDK1.8
Mac安装JDK1.8
690 4