java8学习之Predicate深入剖析与函数式编程本质
上次【http://www.cnblogs.com/webor2006/p/8214596.html】对Predicate函数接口进行了初步的学习,其中提到了在未来要学习的Stream中得到了大量的应用, 正因为很重要,所以这次再详细的对它进行学习,其中还包含它里面定义的一些默认的方法,为之后的学习打下良好的基础。
这里还是以集合过滤做为例子,该集合存放的全是数字,然后提出四个过滤条件:①、从集合元素中找出所有的奇数;②、从集合元素中找出所有的偶数;③、从集合元素中找出所有大于5的数字;④、从集合元素中找出所有小于3的数字。那试想一下如果采用传统的方式要来实现这些需求是不是得定义若干个过滤方法,伪代码如下:
有了Predicate之后,只要定义一个方法既可满足各种过滤条件,如下:
接着来调用它来实现我们的各种需求:
编译运行:
那如果要打印出集合中的所有元素该怎么整呢?直接将条件都置为true不就可以了么,如下:
编译运行:
同理,如果全不打印,则直接返回false既可:
学这些接口怎么使用是一方面,重点是要通过这些接口的使用体会到函数式编程相比传统编程的一个大的区别:函数式编程是传递行为,而传统的编程是传递值。
当然关于元素的遍历还可以利用Stream来实现,这个在之前已经使用了,不过Stream未来会进行详细的学习的,它跟函数式接口及Lambda表达式是昔昔相关的,这是后话,下面再来看一下Predicate接口的其它默认方法:
and():
先来看一下它的javadoc:
下面看一下它的具体实现:
这个方法就了解到这,具体编码等把正同两个也看完之后再一起举例说明。
negate():
继续看javadoc:
or():
了解了and()操作,其这个方法就比较容易理解了,其实就是一个逻辑或的意思,也只是如果有一个为true则直接返回了,这里就不再读javadoc了,比较容易理解。
好了,下面用代码示例来用一下:
下面来调用一下它,这里提一个需求:要求找出集合中所有大于5并且是偶数的数字,很明显是由两个且的关系组成,刚好适合咱们定义的这个方法,如下:
编译运行:
那如果改成or()呢?也就是找到大于5或者是偶数的元素,如下:
再次编译运行:
接下来还是还原则and()操作,这时如果调用一下取反操作呢,如下:
编译运行:
isEqual():
之所以这个最后再说,是因为它不是很重要,实际用得比较少,但是比较难以理解,所以下面也来看一下它的javadoc来理解下:
需要注意的是,是指Objects的equals方法,而非Object.equals(),瞅一眼:
下面看下它的具体实现:
点击"::"看跳转的是哪?
确实是返回的Predicate类型,那为啥呢?看一下该访问的具体实现:
那具体它有啥用呢?下面用代码来说明下:
编译运行:
很显然返回false:
因为isEqual先调用,test后调用,当然时间上不一致,所以返回false,另外这里理解起来有些绕,下面看下:
而:
所以其equals的逻辑就是如此,这个方法不是特别重要,因为不是太实用,但是由于比较难理解,所以有必要理解理解,对我们对于函数式编程可以起到一定的作用。