什么是函数是接口?
函数式接口是一个包含 单个抽象方法 的接口,且可以有任意多个默认方法或静态方法。为了增强可读性,java 8 引入了 @functionalinterface 注解,用于标识该接口是一个函数式接口,编译器会帮助我们检查是否符合函数式接口的规范。
今天我们还讲讲consumer、supplier、predicate、function
这几个接口的用法,在 java8 的用法当中,这几个接口虽然没有明目张胆的使用,但是,却是润物细无声,在许多框架,工具类,方法参数都频频出现。
这几个接口都在java.util.function
包下的,分别是
consumer(消费型)
supplier(供给型)
predicate(谓词型)
function(功能性)
consumer
consumer
是 java 8 中引入的一个函数式接口,位于 java.util.function
包中,主要用于表示一个接受单个输入参数但没有返回值的操作(类似于执行某种“消费”行为)。
可以理解为:参数被消费了,石沉大海了
接口定义
- 泛型 t:表示输入的参数类型。
- accept(t t) 方法:定义了消费操作。
核心特点
- 单输入、无返回值:适用于只需要处理输入而不需要返回结果的场景。
- 支持链式调用:通过
andthen
方法可以组合多个consumer
。
注意事项
不可变性:consumer没有返回值,因此不能直接将结果传递给下一个操作
慎用副作用:避免在consumer中引入全局变量修改等副作用代码
常见用法
1.基本用法
2.结合andthen链式调用
功能:按顺序组合两个 consumer
,前一个完成后调用下一个。
3.结合集合操作
consumer
常用于集合元素的处理。
4.与foreach结合
consumer
是 foreach
的核心参数类型:
5.结合stream api
consumer
可用于 stream
中的终端操作 foreach
:
6.自定义操作
consumer
可用于封装复杂逻辑:
supplier
supplier
接口是 java 8 引入的一个函数式接口,属于 java.util.function
包。它的主要作用是提供一个没有输入参数的结果。supplier
接口的核心方法是 get()
,该方法用于返回一个结果。
理解:空手套白狼,只索取,不付出,供给型接口
接口定义
get()方法,可以看到,是return一个变量
常见用法
1.基本用法
可以通过 lambda 表达式或方法引用来创建 supplier
实例。
2.与stream api结合使用
supplier
可以与 java stream api 结合使用,生成流中的元素。
3.作为方法参数
supplier
可以作为方法参数传递,允许调用者定义生成对象的逻辑。
4.结合optional使用
optional<string> optionalstring = optional.ofnullable(null); string result = optionalstring.orelseget(() -> "default value"); system.out.println(result); // 输出: default value
predicate
predicate
接口是 java 8 引入的一个函数式接口,位于 java.util.function
包中。它的主要作用是用于测试某个条件,返回布尔值。predicate
接口定义了一个抽象方法 test
,接受一个输入参数并返回一个布尔值。
接口定义
常见用法
1.基本用法
2.组合predicate api
predicate接口还提供了几个默认方法,允许组合多个predicate实例
and(predicate other)
: 连接两个predicate
,只有在两个predicate
都为true
时,结果才为true
。or(predicate other)
: 连接两个predicate
,只要其中一个为true
,结果就为true
。negate()
: 反转predicate
的结果。
3.用于过滤集合
predicate常用于集合的过滤操作,特别是与 stream
api 配合使用。你可以使用 filter
方法对集合进行筛选。
4.自定义predicate
也可以创建自己的 predicate
实现
function
java 8 中的 function<t, r>
接口是四大核心函数式接口之一,它用于表示接收一个类型为 t
的参数并返回类型为 r
的结果的操作。
接口定义
常用方法
1.基本用法
2.组合function api
function
接口提供了两个常用的默认方法:andthen()
和 compose()
,还有identity(),可以用来组合多个函数
andthen()
方法用来链式调用
compose()
方法与 andthen()
的区别在于它先应用传入的 function
,再应用当前的 function
一句话总结:这俩方法是相反的
identity()
方法返回一个始终返回其输入参数的函数
identity()
方法在流的处理过程中也有应用,尤其是当我们希望原样返回一个对象时非常有用。
function<integer, integer> identityfunction = function.identity(); system.out.println(identityfunction.apply(10)); // 输出 10
3.与其他函数式接口组合
function
接口常常与其他函数式接口配合使用,特别是在流(streams)处理时,能够大大提升代码的简洁性和可读性。
list<string> names = arrays.aslist("alice", "bob", "charlie", "dave", "eve"); list<string> longnames = names.stream() .filter(name -> name.length() > 3) // 先筛选长度大于 3 的名字 .map(name -> name.touppercase()) // 将符合条件的名字转成大写 .collect(collectors.tolist()); system.out.println(longnames); // 输出 [alice, charlie, dave]
总结
到此这篇关于java8需要知道的4个函数式接口的文章就介绍到这了,更多相关java8函数式接口内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论