还不了解一下 Java 8 Predicate 函数接口
同学你好,这里有一份你的未读代码,等你查收。
这篇文章属于 Java 8 教程(LTS)系列教程,点击阅读更多相关文章。
Predicate
函数接口同之前介绍的 Function 接口一样,是一个函数式接口,它可以接受一个泛型 <T>
参数,返回值为布尔类型。Predicate
常用于数据过滤,如过滤出集合中符合某个条件的元素。
源码:Java 8 中函数接口 Predicate
。
package java.util.function;
import java.util.Objects;
@FunctionalInterface
public interface Predicate<T> {
boolean test(T t);
default Predicate<T> and(Predicate<? super T> other) {
Objects.requireNonNull(other);
return (t) -> test(t) && other.test(t);
}
default Predicate<T> negate() {
return (t) -> !test(t);
}
default Predicate<T> or(Predicate<? super T> other) {
Objects.requireNonNull(other);
return (t) -> test(t) || other.test(t);
}
static <T> Predicate<T> isEqual(Object targetRef) {
return (null == targetRef)
? Objects::isNull
: object -> targetRef.equals(object);
}
}
1. Predicate test
Predicate
函数接口可以用于判断一个参数是否符合某个条件。
示例:判断某个字符串是否为空。
import java.util.function.Predicate;
public class Java8PredicateTest {
public static void main(String[] args) {
Predicate<String> isEmpty = String::isEmpty;
System.out.println(isEmpty.test(""));
System.out.println(isEmpty.test("www.wdbyte.com"));
}
}
输出结果:
true
false
2. Predicate Stream filter
Stream
中的 filter()
方法是通过接收一个 Predicate
函数接口实现的。
示例:过滤出集合中,字符串长度为 4 的字符串。
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
public class Java8PredicateFilter {
public static void main(String[] args) {
List<String> list = Arrays.asList("java", "node", "www.wdbyte.com");
list = list.stream().filter(str -> str.length() == 4).collect(Collectors.toList());
System.out.println(list);
}
}
输出结果:
[java, node]
3. Predicate and
使用 and()
方法,可以让前后两个 Predicate
判断条件一起生效。
示例 1:过滤数字集合中,数字大小在 5 至 9 之间的数字。
import java.util.Arrays;
import java.util.List;
import java.util.function.Predicate;
import java.util.stream.Collectors;
public class Java8PredicateAnd {
public static void main(String[] args) {
List<Integer> numberList = Arrays.asList(3, 4, 5, 6, 7, 8, 9, 10);
Predicate<Integer> greaterThan5 = number -> number > 5;
Predicate<Integer> lessThan9 = number -> number < 9;
Predicate<Integer> filter = greaterThan5.and(lessThan9);
numberList = numberList.stream().filter(filter).collect(Collectors.toList());
System.out.println(numberList);
}
}
结果输出:
[6, 7, 8]
示例 2:一个 Predicate
过滤数字集合中,数字大小在 5 至 9 之间的数字。
List<Integer> numberList = Arrays.asList(3, 4, 5, 6, 7, 8, 9, 10);
numberList = numberList.stream().filter(x -> x > 5 && x < 9).collect(Collectors.toList());
System.out.println(numberList);
输出结果;
[6, 7, 8]
4. Predicate negate
predicate.negate()
方法会返回一个与指定判断相反的 Predicate
。
示例:过滤数字集合中,数字不大于 5 的数字。
import java.util.Arrays;import java.util.List;import java.util.function.Predicate;import java.util.stream.Collectors;public class Java8PredicateNeagete { public static void main(String[] args) { List<Integer> numberList = Arrays.asList(3, 4, 5, 6, 7, 8, 9, 10); Predicate<Integer> greaterThan5 = number -> number > 5; numberList = numberList.stream().filter(greaterThan5.negate()).collect(Collectors.toList()); System.out.println(numberList); }}
输出结果:
[3, 4, 5]
5. Predicate or
示例:过滤数字集合中,数字小于等于 5,或者大于等于 9 的数字。
import java.util.Arrays;import java.util.List;import java.util.function.Predicate;import java.util.stream.Collectors;public class Java8PredicateOr { public static void main(String[] args) { List<Integer> numberList = Arrays.asList(3, 4, 5, 6, 7, 8, 9, 10); Predicate<Integer> lessThan5 = number -> number <= 5; Predicate<Integer> greaterThan8 = number -> number >= 9; numberList = numberList.stream().filter(lessThan5.or(greaterThan8)).collect(Collectors.toList()); System.out.println(numberList); }}
输出结果:
[3, 4, 5, 9, 10]
6. Predicate 链式编程
Predicate
的 or()
,and()
,negate()
方法可以随意组合 Predicate
,组合后的判断逻辑是从左到右,从前到后,顺次判断。
如:(数字小于 5 ).and (数字大于 9 ).negate()。
解:(数字小于 5 )AND (数字大于 9 ) 对于任意数字都得 false
,false.negate()
取相反 得 true
。
所以,此判断逻辑对于任意数字都为 true
。
示例:Predicate
的 or()
,and()
,negate()
方法组合使用。
import java.util.ArrayList;import java.util.Arrays;import java.util.List;import java.util.function.Predicate;public class Java8PredicateChain { public static void main(String[] args) { List<Integer> numberList = Arrays.asList(3, 4, 5, 6, 7, 8, 9, 10); Predicate<Integer> lessThan5 = number -> number <= 5; Predicate<Integer> greaterThan9 = number -> number >= 9; // 小于等于 5 System.out.println(filter(numberList, lessThan5)); // 大于 5 System.out.println(filter(numberList, lessThan5.negate())); // 小于等于 5 或者大于等于 9 System.out.println(filter(numberList, lessThan5.or(greaterThan9))); // ! (小于等于 5 AND 大于等于 9) System.out.println(filter(numberList, lessThan5.and(greaterThan9).negate())); } public static <T> List<T> filter(List<T> list, Predicate<T> predicate) { List<T> resultList = new ArrayList<>(); for (T t : list) { if (predicate.test(t)) { resultList.add(t); } } return resultList; }}
输出结果:
[3, 4, 5][6, 7, 8, 9, 10][3, 4, 5, 9, 10][3, 4, 5, 6, 7, 8, 9, 10]
7. Predicate 与对象
示例:过滤符合某些特征的狗。
import java.util.ArrayList;import java.util.List;import java.util.function.Predicate;public class Java8PredicateObject { public static void main(String[] args) { List<Dog> dogList = new ArrayList<>(); dogList.add(new Dog("哈士奇", 1)); dogList.add(new Dog("牧羊犬", 2)); dogList.add(new Dog("柯基", 3)); dogList.add(new Dog("柴犬", 3)); // 找到 3岁的狗 System.out.println(filter(dogList, dog -> dog.getAge().equals(3))); // 找到哈士奇信息 Predicate<Dog> predicate = dog -> ("哈士奇").equals(dog.getName()); System.out.println(filter(dogList, predicate)); } public static <T> List<T> filter(List<T> list, Predicate<T> predicate) { List<T> resultList = new ArrayList<>(); for (T t : list) { if (predicate.test(t)) { resultList.add(t); } } return resultList; }}class Dog { private String name; private Integer age; public Dog(String name, Integer age) { this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } @Override public String toString() { return "Dog{" + "name='" + name + '\'' + ", age=" + age + '}'; }}
输出结果:
[Dog{name='柯基', age=3}, Dog{name='柴犬', age=3}][Dog{name='哈士奇', age=1}]
BiPredicate
和 Predicate
函数接口一样,都是返回一个布尔类型,唯一不同的是 Predicate
接受一个参数,而 BiPredicate
可以接受两个不同类型的参数。
BiPredicate
在 Java 8 中源码:
package java.util.function;
import java.util.Objects;
@FunctionalInterface
public interface BiPredicate<T, U> {
boolean test(T t, U u);
default BiPredicate<T, U> and(BiPredicate<? super T, ? super U> other) {
Objects.requireNonNull(other);
return (T t, U u) -> test(t, u) && other.test(t, u);
}
default BiPredicate<T, U> negate() {
return (T t, U u) -> !test(t, u);
}
default BiPredicate<T, U> or(BiPredicate<? super T, ? super U> other) {
Objects.requireNonNull(other);
return (T t, U u) -> test(t, u) || other.test(t, u);
}
}
扩展阅读
参考
BiPredicate (Java Platform SE 8 )
Predicate (Java Platform SE 8 )
这篇文章就到这里了,我是一个想认认真真写写文章的爱折腾的程序猿。
如果想要订阅,可以关注公众号 “未读代码” ,或者未读代码博客,或者加我微信( wn8398)。
本文也已经整理到 GitHub.com/niumoo/JavaNotes,欢迎 Star。
还不了解一下 Java 8 Predicate 函数接口的更多相关文章
- Java 8 Function 函数接口
这篇文章属于 Java 8 教程(LTS)系列教程 在 Java 8 中,Function 接口是一个函数接口,它位于包 java.util.function 下. Function 接口中定义了一个 ...
- java8 函数接口 Predicate例子
import java.util.HashSet; import java.util.Collection; import java.util.function.Predicate; public c ...
- Java 8 函数接口详细教程
ay = new byte[array.length]; for (int i = 0; i < array.length; i++) { transformedArray[i] = funct ...
- 还看不懂同事的代码?Lambda 表达式、函数接口了解一下
当前时间:2019年 11月 11日,距离 JDK 14 发布时间(2020年3月17日)还有多少天? // 距离JDK 14 发布还有多少天? LocalDate jdk14 = LocalDate ...
- Lambda函数接口和方法构造器应用
函数式接口 什么是函数式接口? 在java中'有且仅有一个抽象方法的接口',就称为函数式接口. 可以通过Lambda表达式来创建该接口的对象.(若Lambda表达式抛出一个受检异常,那么该异常需要在目 ...
- Java学习:常用函数接口
常用函数接口 什么是函数式接口? 函数式接口,@FunctionalInterface,简称FI,简单的说,FI就是指仅含有一个抽象方法的接口,以@Functionalnterface标注 注意:这里 ...
- 【Java 8】函数式接口(二)—— 四大函数接口介绍
前言 Java8中函数接口有很多,大概有几十个吧,具体究竟是多少我也数不清,所以一开始看的时候感觉一脸懵逼,不过其实根本没那么复杂,毕竟不应该也没必要把一个东西设计的很复杂. 几个单词 在学习了解之前 ...
- 使用Java函数接口及lambda表达式隔离和模拟外部依赖更容易滴单测
概述 单测是提升软件质量的有力手段.然而,由于编程语言上的支持不力,以及一些不好的编程习惯,导致编写单测很困难. 最容易理解最容易编写的单测,莫过于独立函数的单测.所谓独立函数,就是只依赖于传入的参数 ...
- Java函数接口实现函数组合及装饰器模式
摘要: 通过求解 (sinx)^2 + (cosx)^2 = 1 的若干写法,逐步展示了如何从过程式的写法转变到函数式的写法,并说明了编写"[接受函数参数]并返回[能够接受函数参数的函数]的 ...
随机推荐
- LTDC_DMA2D驱动实验
STM32F429芯片使用LTDC.DMA2D.及RAM存储器,构成了一个完整的液晶控制器.LTDC负责不断刷新液晶屏(将数据从显存搬运到液晶屏),DMA2D用于图像数据搬运.混合及格式转换(将数据搬 ...
- 一次性搞清Java中的类加载问题
摘要:很多时候提到类加载,大家总是没法马上回忆起顺序,这篇文章会用一个例子为你把类加载的诸多问题一次性澄清. 本文分享自华为云社区<用1个例子加5个问题,一次性搞清java中的类加载问题[奔跑吧 ...
- Spring Cloud专题之三:Hystrix
在微服务架构中,我们将系统拆分成很多个服务单元,各单位的应用间通过服务注册与订阅的方式相互依赖.由于每个单元都在不同的进程中运行,依赖通过远程调用的方式执行,这样就有可能因为网络原因或是依赖服务自身问 ...
- 喜鹊开发者(The Magpie Developer)
搬运文,原文地址:https://div.io/topic/1576 我经常感觉,开发人员很像我们所说的喜鹊,以不停的获取很多小玩意来装饰他们的窝而著称.就像喜鹊一样,开发人员通常都被定义为聪明的.好 ...
- 不带Anchors和NMS的目标检测
前言: 目标检测是计算机视觉中的一项传统任务.自2015年以来,人们倾向于使用现代深度学习技术来提高目标检测的性能.虽然模型的准确性越来越高,但模型的复杂性也增加了,主要是由于在训练和NMS后处理过 ...
- Mybatis:Mybatis 逆向工程 generator配置
一.使用Maven方式引入Mybatis依赖Jar包(版本号自己改或定义)
- Python中的json学习
p.p1 { margin: 0; font: 14px ".PingFang SC"; color: rgba(53, 53, 53, 1) } p.p2 { margin: 0 ...
- XCTF-boomshakalaka-3
这题讲道理出的挺脑洞的,apk直接拖入jeb打开,找到主活动 这里有两个方法,一个是onCreate()方法,还有一个是onCreateView()方法 onCreate()方法调用了a这个对象的d方 ...
- Java的反射机制一
Java具有一定的动态性,我们可以利用反射机制,字节码操作来获得类似动态语言的特性. 动态操作对象,构造方法,属性,方法 Demo2 如何取得属性和方法以及构造器 public class Demo2 ...
- Kotlin Coroutine(协程): 二、初识协程
@ 目录 前言 一.初识协程 1.runBlocking: 阻塞协程 2.launch: 创建协程 3.Job 4.coroutineScope 5.协程取消 6.协程超时 7.async 并行任务 ...