上次【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深入剖析与函数式编程本质的更多相关文章

  1. 【转】Java8学习笔记(1) -- 从函数式接口说起

    http://blog.csdn.net/zxhoo/article/details/38349011 函数式接口 理解Functional Interface(函数式接口,以下简称FI)是学习Jav ...

  2. Python学习(20):Python函数(4):关于函数式编程的内建函数

    转自http://www.cnblogs.com/BeginMan/p/3178103.html 一.关于函数式编程的内建函数 apply()逐渐被舍弃,这里不讨论 1.filter() #filte ...

  3. Scala 学习(9)之「函数式编程」

    引用透明 对相同的输入,总是能得到相同的输出. 如果 f(x) 的参数 x 和函数体都是引用透明的,那么函数 f 是纯函数. 违反引用透明的例子 我们可以很清楚的看到,对于相同的输入,第二次调用app ...

  4. java8学习之Lambda表达式初步与函数式接口

    对于Java8其实相比之前的的版本增加的内容是相当多的,其中有相当一大块的内容是关于Lambda表达式与Stream API,而这两部分是紧密结合而不能将其拆开来对待的,但是是可以单独使用的,所以从学 ...

  5. java8学习之Stream陷阱剖析

    上一次[http://www.cnblogs.com/webor2006/p/8297603.html]在最后用stream.iterate()生成了6个奇数,接着基于它来实现如下需求:找出该流中大于 ...

  6. java8学习之Stream实例剖析

    继续操练Stream,直接上代码: 而咱们要返回ArrayList,显示可以用构造引用来传递到里面,因为它刚好符合Supplier函数式接口的特性:不接收参数返回一个值,所以: 接下来试着将Strea ...

  7. JAVA8学习——新的时间日期API&Java8总结

    JAVA8-时间日期API java8之前用过的时间日期类. Date Calendar SimpleDateFormat 有很多致命的问题. 1.没有时区概念 2.计算麻烦,实现困难 3.类是可变的 ...

  8. C#中的函数式编程:序言(一)

    学了那么久的函数式编程语言,一直想写一些相关的文章.经过一段时间的考虑,我决定开这个坑. 至于为什么选择C#,在我看来,编程语言分三类:一类是难以进行函数式编程的语言,这类语言包括Java6.C语言等 ...

  9. Java函数式编程原理以及应用

    一. 函数式编程 Java8所有的新特性基本基于函数式编程的思想,函数式编程的带来,给Java注入了新鲜的活力. 下面来近距离观察一下函数式编程的几个特点: 函数可以作为变量.参数.返回值和数据类型. ...

随机推荐

  1. harbor API 与tag 清理

    harbor API 官方swagger swagger在线查看 harbor tag 清理 python程序 import requests import json class RequestCli ...

  2. 【算法集中营】CRC16 三种算法及c实现

    标准CRC生成多项式如下表: 名称       生成多项式             简记式*  标准引用    CRC-4       x4+x+1                  3        ...

  3. 基于vue-cli项目打包慢的定位优化过程

    入职一周后,上一个前端就离职了(超级坑爹的),留下了一个比较棘手的问题,就是基于vue-cli的项目打包超级慢,我接手项目的时候,打包需要45min(上个离职者也不知道原因),经过3个月之后,随着项目 ...

  4. 对pdf 表单域 或文本框的操作---动态填充PDF 文件内容

    前提:需要pdf模板:并且模板内容以pdf 文本框的形式填写 package com.test;import java.io.File;import java.io.FileOutputStream; ...

  5. luogu P3959(2017noipTG D2T2

    luogu P3959(2017noipTG D2T2 不知道为什么,这两天见了好多伪装成图的dp题,这道也是. 最短路只有40分,实际上可以从数据范围n<=12看出来是状压dp. soluti ...

  6. pycharm虚拟环境的搭建

    目录 优点 windows 安装 配置虚拟环境管理器工作目录 MacOS.Linux 安装 工作文件 配置 使用 pycharm使用 新建项目 添加环境 使用环境 优点 1.使不同应用开发环境相互独立 ...

  7. HDU3622 Bomb Game(二分+2-SAT)

    题意 给n对炸弹可以放置的位置(每个位置为一个二维平面上的点), 每次放置炸弹是时只能选择这一对中的其中一个点,每个炸弹爆炸 的范围半径都一样,控制爆炸的半径使得所有的爆炸范围都不相 交(可以相切), ...

  8. frp基础操作

    [common]privilege_mode = true privilege_token = ****bind_port = 7000 dashboard_user = 444444dashboar ...

  9. Visual Studio高分屏下Winform界面变形

    现在高分屏的电脑越来越多,2K屏,4K屏层出不穷,对于.net开发人员来说,尤其是Winform开发者, 分辨率一直是个比较头疼的事情,屏幕分辨率高了,如果仍然设置显示100%,会导致字体非常小,影响 ...

  10. 帝国cms 加载更多的实现(父栏目以及子栏目都可以实现)

    1. <div class="pagelist"> <span id="loadmore" class="btn" sty ...