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的逻辑就是如此,这个方法不是特别重要,因为不是太实用,但是由于比较难理解,所以有必要理解理解,对我们对于函数式编程可以起到一定的作用。
java8学习之Predicate深入剖析与函数式编程本质的更多相关文章
- 【转】Java8学习笔记(1) -- 从函数式接口说起
http://blog.csdn.net/zxhoo/article/details/38349011 函数式接口 理解Functional Interface(函数式接口,以下简称FI)是学习Jav ...
- Python学习(20):Python函数(4):关于函数式编程的内建函数
转自http://www.cnblogs.com/BeginMan/p/3178103.html 一.关于函数式编程的内建函数 apply()逐渐被舍弃,这里不讨论 1.filter() #filte ...
- Scala 学习(9)之「函数式编程」
引用透明 对相同的输入,总是能得到相同的输出. 如果 f(x) 的参数 x 和函数体都是引用透明的,那么函数 f 是纯函数. 违反引用透明的例子 我们可以很清楚的看到,对于相同的输入,第二次调用app ...
- java8学习之Lambda表达式初步与函数式接口
对于Java8其实相比之前的的版本增加的内容是相当多的,其中有相当一大块的内容是关于Lambda表达式与Stream API,而这两部分是紧密结合而不能将其拆开来对待的,但是是可以单独使用的,所以从学 ...
- java8学习之Stream陷阱剖析
上一次[http://www.cnblogs.com/webor2006/p/8297603.html]在最后用stream.iterate()生成了6个奇数,接着基于它来实现如下需求:找出该流中大于 ...
- java8学习之Stream实例剖析
继续操练Stream,直接上代码: 而咱们要返回ArrayList,显示可以用构造引用来传递到里面,因为它刚好符合Supplier函数式接口的特性:不接收参数返回一个值,所以: 接下来试着将Strea ...
- JAVA8学习——新的时间日期API&Java8总结
JAVA8-时间日期API java8之前用过的时间日期类. Date Calendar SimpleDateFormat 有很多致命的问题. 1.没有时区概念 2.计算麻烦,实现困难 3.类是可变的 ...
- C#中的函数式编程:序言(一)
学了那么久的函数式编程语言,一直想写一些相关的文章.经过一段时间的考虑,我决定开这个坑. 至于为什么选择C#,在我看来,编程语言分三类:一类是难以进行函数式编程的语言,这类语言包括Java6.C语言等 ...
- Java函数式编程原理以及应用
一. 函数式编程 Java8所有的新特性基本基于函数式编程的思想,函数式编程的带来,给Java注入了新鲜的活力. 下面来近距离观察一下函数式编程的几个特点: 函数可以作为变量.参数.返回值和数据类型. ...
随机推荐
- linux 网络相关
1. 配bond 模式 将eth0 和 eth1 绑定 ,master 为bond2 ,直接上文件 eth0 和 eth1 , 类似,如下 ,关键点 MASTER and SLAVE TYPE ...
- hydra 使用
Hydra介绍 Hydra是一个并行登录破解器,支持多种攻击协议.它非常快速和灵活,新模块易于添加.该工具使研究人员和安全顾问能够展示远程获得对系统未经授权的访问是多么容易. 它支持:Cisco AA ...
- css 未知子元素宽高的居中
.parent{ position:relative; } .child{ position:absolute; left:50%; top:50%; transform:translate(-50% ...
- python手撸桌面计算器
网上有一些许多关于计算器的源码,但我似乎不太care 一直寻思着自己手撸一个才有意思,于是这就开始了 实现功能: 1.基本的两个数 +-x÷ 运算以及取反,百分之,平方等 2.支持连续运算 3.暂不支 ...
- sql次级语句
select upper(n_id) from nrc_news;select left(n_content,1) from nrc_news;select len(n_content) from n ...
- [计蒜客T2238]礼物_线段树_归并排序_概率期望
礼物 题目大意: 数据范围: 题解: 这题有意思啊($md$卡常 直接做怎么做? 随便上个什么东西,维护一下矩阵乘和插入,比如说常数还算小的$KD-Tree$(反正我是没见人过过 我们漏掉了一个条件, ...
- SQL Server 验证身份证合法性函数(使用VBScript.RegExp)
原文:SQL Server 验证身份证合法性函数(使用VBScript.RegExp) 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/wzy0623 ...
- java中的 |=、&=、^=
|= 关于 |= 运算符:|= 运算符和 += 这一类的运算符一样,拆解开就是 a = a | b: 代码如下: public static strictfp void main(String[] ...
- PAT A1036 Boys vs Girls(25)
AC代码 #include <cstdio> #include <algorithm> using namespace std; const int max_n = 11000 ...
- 二项式定理+前缀Sigma
https://hihocoder.com/problemset/problem/1430 思路: 要用前缀去推Sigma总公式,比较方便.https://blog.csdn.net/weixin_3 ...