java有哪些函数_看看Java有哪些函数式接口

java8提供了诸多的函数式接口,使用@FunctionalInterface声明的全部属于函数式接口并且只有一个待实现方法的接口。位于java.util.function包下,今天来罗列一些比较常见的。

Function

Function在理念上可以理解为生产者,可以输出一个result,而这个result就是Function所产出的结果。

上图为Function接口的注释,翻译过来时Function接受一个参数并且会生产出一个result。

a42af5e2878c57407ff246989b3c4835.png

上图所示为Function的核心待实现方法,接受一个参数,生产一个result。

0bc9fc87b3f3bb49fa1e9e70abb7c74e.png

上图为Function的compose默认实现方法,意思是参数before产出的结果作为当前对象的apply的入参。

364698db5fc1e405c51e4ed687f6fcc7.png

上图为Function的andThen默认实现方法,意思是当前apply执行的生产出的结构作为入参after的入参使用。

Consumer

Consumer在理念上可以理解为消费者,可以消费一个arg,而这个arg就是Consumer函数式接口中待实现方法的入参。

96145dbacdc3300d2f1f6a5749ac3ebd.png

翻译过来就是Consumer只有一个入参并且不会产出result。

16670320516c726f8b0a3674b3bdf083.png

核心方法只有一个入参。

Predicate

predicate在理念上可以理解为断言的,也就是用于判断对错的函数式接口。

73ebf61aecb1cedea82ef5630786e035.png

翻译过来就是一个入参,返回布尔类型的值,一般用于断言一个对象是否满足某种约束。

c8a6e4c2e7eb670a1bdc9b899628acf9.png

and方法是默认实现方法,把一个断言对象和当前的断言布尔值进行并操作

1ca73c4516208fd73924ab5f98444fd2.png

negate默认实现方法是对当前断言结果进行取反操作。

其他方法道理类似。比如or默认实现方法等。

在java.util.function包下还有一些Bi开头的接口,一般是指入参有两个。比如BiFunction。

Java8编程约定

在java8+的版本编程中,一般约定大于配置,约定编程思想,也是Java8提供诸多的函数式接口的原因,使用函数式编程可以降低代码冗余性,提供编码效率,但可能新手不易看懂。在guava这个项目中,谷歌工程师对于java的函数式编程做了很多的补充。作者将java8所提供的的所有函数式接口统一做了继承补充,并且增加每一种函数式接口的工具类,比如说针对于Function的工具类为Functions,但也还是万变不离其宗,只是为了开发人员更快的调用实现这个函数式接口做了快捷式的封装。

Optional

为了更易于理解这些函数式接口的使用,我们先来看下防空神器的Optional如何避免空指针。

04a1bb40b7e857d4a5bb9be4ff0c57c0.png

图所示代码,我们新创建了一个集合,并且添加了一个字符串元素,然后需要在这个集合中找到包含"off"这个字符串的对象,如果能找到一个就满足条件,如果找不到结果则为空,那么找到这个元素之后并且进行切割,如果这个元素为空,调用substring方法会出现空指针异常。optional的ifPresent会避免空指针,意思是不为空的情况下会接受一个开发者自定义的Consumer函数进行自定义处理入参。所以此时我们需要用到Consumer这个函数式接口来消费optional返回的结果。上图中代码没有使用lambda表达式进行缩减Consumer的实现体。缩减之后如下图所示。

本次技术分享就到这,加技术群一起讨论进步~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值