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注入了新鲜的活力. 下面来近距离观察一下函数式编程的几个特点: 函数可以作为变量.参数.返回值和数据类型. ...
随机推荐
- Protel99SE推荐使用英文版
Protel99SE的汉化版功能并不全,最好还是用英文原版,功能是最齐全的.用英文版的软件其实也不难,有限的几个词,习惯就好了.
- vue中数组检测重复性的两个方法
检查数组重复(一)let inputValue = this.positionGroupInput[groupId].inputValue; if (inputValue) { for (let po ...
- vs .net WebForm 模板添加注释
首先说一点,好久不更新博客了.今天公司服务器不能用了,闲着没事儿,更新一篇博客. 今天要说的就是vs2010下,如何更改各种文件的模板,以省去每次新添加文件时,还得给文件添加文件标示注释等时间.很大程 ...
- 【VS开发】【C/C++开发】C++参数策略传递内存
参数策略 如果函数的参数是一个指针,不要指望用该指针去动态申请内存.如下: void GetMemory(char *p, int num) { p = (char *)malloc(sizeof(c ...
- 2019-07-30 C#基础知识学习
继承和多态 接口与抽象类的区别:1.在接口中仅能定义成员,但是不能有具体的实现:抽象类除了抽象成员以外,其他成员有具体的实现.2.在接口中不能声明字段,并且不能声明任何私有成员,成员不能包含任何修饰符 ...
- MYsql 客户端下载地址
workbench: https://www.mysql.com/cn/products/workbench/
- PHP生成中文验证码并检测对错实例
PHP生成中文验证码并检测对错实例,中文验证码的例子还是比较少的,今天给大家分享一下,支持自定义中文.字体.背景色等 生成验证码,注意font字体路径要对,否则显示图片不存在 session_star ...
- python中的类变量和对象变量,以及传值传引用的探究
http://www.cnblogs.com/gtarcoder/p/5005897.html http://www.cnblogs.com/mexh/p/9967811.html
- Elasticsearch5.x安装及常见错误的解决方法
Elasticsearch是基于java开发的,机器上必须要先java环境,elasticsearch5.x建议用jdk8的最新版本.下面介绍elasticsearch5.x的安装步骤: 一.安装El ...
- Django-choices字段值对应关系(性别)-MTV与MVC科普-Ajax发json格式与文件格式数据-contentType格式-Ajax搭配sweetalert实现删除确认弹窗-自定义分页器-批量插入-07
目录 models 字段补充 choices 参数/字段(用的很多) MTV与MVC模型 科普 Ajax 发送 GET.POST 请求的几种常见方式 用 Ajax 做一个小案例 准备工作 动手用 Aj ...