看看Java有哪些函数式接口
Posted 开源拾椹
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了看看Java有哪些函数式接口相关的知识,希望对你有一定的参考价值。
java8提供了诸多的函数式接口,使用@FunctionalInterface声明的全部属于函数式接口并且只有一个待实现方法的接口。位于java.util.function包下,今天来罗列一些比较常见的。
Function
Function在理念上可以理解为生产者,可以输出一个result,而这个result就是Function所产出的结果。
上图为Function接口的注释,翻译过来时Function接受一个参数并且会生产出一个result。
上图所示为Function的核心待实现方法,接受一个参数,生产一个result。
上图为Function的compose默认实现方法,意思是参数before产出的结果作为当前对象的apply的入参。
上图为Function的andThen默认实现方法,意思是当前apply执行的生产出的结构作为入参after的入参使用。
Consumer
Consumer在理念上可以理解为消费者,可以消费一个arg,而这个arg就是Consumer函数式接口中待实现方法的入参。
翻译过来就是Consumer只有一个入参并且不会产出result。
核心方法只有一个入参。
Predicate
predicate在理念上可以理解为断言的,也就是用于判断对错的函数式接口。
翻译过来就是一个入参,返回布尔类型的值,一般用于断言一个对象是否满足某种约束。
and方法是默认实现方法,把一个断言对象和当前的断言布尔值进行并操作
negate默认实现方法是对当前断言结果进行取反操作。
其他方法道理类似。比如or默认实现方法等。
在java.util.function包下还有一些Bi开头的接口,一般是指入参有两个。比如BiFunction。
Java8编程约定
在java8+的版本编程中,一般约定大于配置,约定编程思想,也是Java8提供诸多的函数式接口的原因,使用函数式编程可以降低代码冗余性,提供编码效率,但可能新手不易看懂。在guava这个项目中,谷歌工程师对于java的函数式编程做了很多的补充。作者将java8所提供的的所有函数式接口统一做了继承补充,并且增加每一种函数式接口的工具类,比如说针对于Function的工具类为Functions,但也还是万变不离其宗,只是为了开发人员更快的调用实现这个函数式接口做了快捷式的封装。
Optional
为了更易于理解这些函数式接口的使用,我们先来看下防空神器的Optional如何避免空指针。
图所示代码,我们新创建了一个集合,并且添加了一个字符串元素,然后需要在这个集合中找到包含"off"这个字符串的对象,如果能找到一个就满足条件,如果找不到结果则为空,那么找到这个元素之后并且进行切割,如果这个元素为空,调用substring方法会出现空指针异常。optional的ifPresent会避免空指针,意思是不为空的情况下会接受一个开发者自定义的Consumer函数进行自定义处理入参。所以此时我们需要用到Consumer这个函数式接口来消费optional返回的结果。上图中代码没有使用lambda表达式进行缩减Consumer的实现体。缩减之后如下图所示。
本次技术分享就到这,加技术群一起讨论进步~
以上是关于看看Java有哪些函数式接口的主要内容,如果未能解决你的问题,请参考以下文章