Java Predicate
Predicate 接口说明
/*
* Copyright (c) 2010, 2013, Oracle and/or its affiliates. All rights reserved.
* ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
*/
package java.util.function; import java.util.Objects; /**
* Represents a predicate (boolean-valued function) of one argument.
*
* <p>This is a <a href="package-summary.html">functional interface</a>
* whose functional method is {@link #test(Object)}.
*
* @param <T> the type of the input to the predicate
*
* @since 1.8
*/
@FunctionalInterface
public interface Predicate<T> { /**
* Evaluates this predicate on the given argument.
*
* @param t the input argument
* @return {@code true} if the input argument matches the predicate,
* otherwise {@code false}
*/
boolean test(T t); /**
* Returns a composed predicate that represents a short-circuiting logical
* AND of this predicate and another. When evaluating the composed
* predicate, if this predicate is {@code false}, then the {@code other}
* predicate is not evaluated.
*
* <p>Any exceptions thrown during evaluation of either predicate are relayed
* to the caller; if evaluation of this predicate throws an exception, the
* {@code other} predicate will not be evaluated.
*
* @param other a predicate that will be logically-ANDed with this
* predicate
* @return a composed predicate that represents the short-circuiting logical
* AND of this predicate and the {@code other} predicate
* @throws NullPointerException if other is null
*/
default Predicate<T> and(Predicate<? super T> other) {
Objects.requireNonNull(other);
return (t) -> test(t) && other.test(t);
} /**
* Returns a predicate that represents the logical negation of this
* predicate.
*
* @return a predicate that represents the logical negation of this
* predicate
*/
default Predicate<T> negate() {
return (t) -> !test(t);
} /**
* Returns a composed predicate that represents a short-circuiting logical
* OR of this predicate and another. When evaluating the composed
* predicate, if this predicate is {@code true}, then the {@code other}
* predicate is not evaluated.
*
* <p>Any exceptions thrown during evaluation of either predicate are relayed
* to the caller; if evaluation of this predicate throws an exception, the
* {@code other} predicate will not be evaluated.
*
* @param other a predicate that will be logically-ORed with this
* predicate
* @return a composed predicate that represents the short-circuiting logical
* OR of this predicate and the {@code other} predicate
* @throws NullPointerException if other is null
*/
default Predicate<T> or(Predicate<? super T> other) {
Objects.requireNonNull(other);
return (t) -> test(t) || other.test(t);
} /**
* Returns a predicate that tests if two arguments are equal according
* to {@link Objects#equals(Object, Object)}.
*
* @param <T> the type of arguments to the predicate
* @param targetRef the object reference with which to compare for equality,
* which may be {@code null}
* @return a predicate that tests if two arguments are equal according
* to {@link Objects#equals(Object, Object)}
*/
static <T> Predicate<T> isEqual(Object targetRef) {
return (null == targetRef)
? Objects::isNull
: object -> targetRef.equals(object);
}
}
根据接口说明,Predicate 提供的为逻辑判断操作,即断言。
静态方法isEqual:判断是否相等,并返回一个Predicate对象
调用:Predicate.isEqual(Object1).test(Object2)
含义:使用Object1的equals方法判断Object2是否与其相等。
默认方法and,or,negate:分别代表逻辑判断与、或、非并都返回一个Predicate对象
调用:Predicate1.and(Predicate2).test(Object)
含义:判断Object对象是否满足Predicate1 && Predicate2
方法test:按照给定的Predicate条件进行逻辑判断。
package org.htsg; import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.function.Predicate; /**
* @author HTSG
*/
public class PredicateTest {
public static void main(String[] args) {
// 添加十个学生
List<Student> studentList = new ArrayList<>(10);
for (int i = 0; i < 10; i++) {
studentList.add(new Student("student" + i, 10 + i));
}
// 获取年龄大于15的学生
// [Student{name='student6', age=16}, Student{name='student7', age=17}, Student{name='student8', age=18}, Student{name='student9', age=19}]
List<Student> filteredStudents = test(studentList, PredicateTest::filterAge1);
System.out.println(filteredStudents);
// 获取年龄大于15并且名字叫 "student7" 的学生
// [Student{name='student7', age=17}]
filteredStudents = and(studentList, PredicateTest::filterAge1, PredicateTest::filterName);
System.out.println(filteredStudents);
// 获取年龄不大于15的学生
// [Student{name='student0', age=10}, Student{name='student1', age=11}, Student{name='student2', age=12}, Student{name='student3', age=13}, Student{name='student4', age=14}, Student{name='student5', age=15}]
filteredStudents = negate(studentList, PredicateTest::filterAge1);
System.out.println(filteredStudents);
// 获取年龄不大于15或名字叫 "student7" 的学生
// [Student{name='student0', age=10}, Student{name='student1', age=11}, Student{name='student2', age=12}, Student{name='student3', age=13}, Student{name='student4', age=14}, Student{name='student5', age=15}, Student{name='student7', age=17}]
filteredStudents = or(studentList, PredicateTest::filterAge2, PredicateTest::filterName);
System.out.println(filteredStudents);
// 获取和目标学生属性值相同的学生列表
// [Student{name='student1', age=11}]
filteredStudents = isEqual(studentList, new Student("student1", 11));
System.out.println(filteredStudents); } public static boolean filterAge1(Student student) {
return student.getAge() > 15;
} public static boolean filterAge2(Student student) {
return student.getAge() <= 15;
} public static boolean filterName(Student student) {
return "student7".equals(student.getName());
} public static List<Student> test(List<Student> students, Predicate<Student> pre) {
List<Student> result = new ArrayList<>(10);
for (Student student : students) {
if (pre.test(student)) {
result.add(student);
}
}
return result;
} public static List<Student> and(List<Student> students, Predicate<Student> pre1, Predicate<Student> pre2) {
List<Student> result = new ArrayList<>(10);
for (Student student : students) {
if (pre1.and(pre2).test(student)) {
result.add(student);
}
}
return result;
} public static List<Student> negate(List<Student> students, Predicate<Student> pre) {
List<Student> result = new ArrayList<>(10);
for (Student student : students) {
if (pre.negate().test(student)) {
result.add(student);
}
}
return result;
} public static List<Student> or(List<Student> students, Predicate<Student> pre1, Predicate<Student> pre2) {
List<Student> result = new ArrayList<>(10);
for (Student student : students) {
if (pre1.or(pre2).test(student)) {
result.add(student);
}
}
return result;
} public static List<Student> isEqual(List<Student> students, Student student) {
List<Student> result = new ArrayList<>(10);
for (Student studentTemp : students) {
if (Predicate.isEqual(student).test(studentTemp)) {
result.add(studentTemp);
}
}
return result;
} // 创建静态内部类
public static class Student {
private String name;
private int age; public Student() {
} public Student(String name, int age) {
this.name = name;
this.age = age;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public int getAge() {
return age;
} public void setAge(int age) {
this.age = age;
} @Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
} @Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
Student student = (Student) o;
return age == student.age &&
Objects.equals(name, student.name);
}
}
}
Java Predicate的更多相关文章
- J2SE 8的Lambda --- functions
functions //1. Runnable 输入参数:无 返回类型void new Thread(() -> System.out.println("In Java8!" ...
- Spark案例分析
一.需求:计算网页访问量前三名 import org.apache.spark.rdd.RDD import org.apache.spark.{SparkConf, SparkContext} /* ...
- lambda -- Java 8 find first element by predicate
Java 8 find first element by predicate up vote6down votefavorite I've just started playing with ...
- Java 8 基础教程 - Predicate
在Java 8中,Predicate是一个函数式接口,可以被应用于lambda表达式和方法引用.其抽象方法非常简单: /** * Evaluates this predicate on the giv ...
- Java 8 新特性:4-断言(Predicate)接口
(原) 这个接口主要用于判断,先看看它的实现,说明,再给个例子. /* * Copyright (c) 2010, 2013, Oracle and/or its affiliates. All ri ...
- 一点一点看JDK源码(五)java.util.ArrayList 后篇之removeIf与Predicate
一点一点看JDK源码(五)java.util.ArrayList 后篇之removeIf与Predicate liuyuhang原创,未经允许禁止转载 本文举例使用的是JDK8的API 目录:一点一点 ...
- java代码之美(13)--- Predicate详解
java代码之美(13)--- Predicate详解 遇到Predicate是自己在自定义Mybatis拦截器的时候,在拦截器中我们是通过反射机制获取对象的所有属性,再查看这些属性上是否有我们自定义 ...
- Java常用函数式接口--Predicate接口使用案例
Java常用函数式接口--Predicate接口使用案例 该方法可以使用and来优化: 调用:
- java 8中 predicate chain的使用
目录 简介 基本使用 使用多个Filter 使用复合Predicate 组合Predicate Predicate的集合操作 总结 java 8中 predicate chain的使用 简介 Pred ...
随机推荐
- nodepad++如何多行同时编辑
notepad++ 可以选中alt按键进行选择 支持同时编辑多行
- $2019$ 暑期刷题记录1:(算法竞赛DP练习)
$ 2019 $ 暑期刷题记录: $ POJ~1952~~BUY~LOW, BUY~LOWER: $ (复杂度优化) 题目大意:统计可重序列中最长上升子序列的方案数. 题目很直接的说明了所求为 $ L ...
- 前端每日实战:43# 视频演示如何用纯 CSS 绘制一个充满动感的 Vue logo
效果预览 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/zaqKPx 可交互视频教程 此视频 ...
- 三栏布局的三个典型方法(圣杯、双飞翼、flex)
聊聊三栏布局----左右定宽,中间自适应. 效果图: 圣杯布局 <!DOCTYPE html> <html> <head lang="en"> ...
- 如何从word中复制内容到网站后台编辑器中
word图片转存,是指UEditor为了解决用户从word中复制了一篇图文混排的文章粘贴到编辑器之后,word文章中的图片数据无法显示在编辑器中,也无法提交到服务器上的问题而开发的一个操作简便的图片转 ...
- Cocoapods组件化之搭建组件化项目框架
一,概述 随着公司业务需求的不断迭代发展,工程的代码量和业务逻辑也越来越多,原始的开发模式和架构已经无法满足我们的业务发展速度了,这时我们就需要将原始项目进行一次重构大手术了.这时我们应该很清晰这次手 ...
- Xcode编辑器之快捷键的使用
一,快捷键图标 图标 键盘 ⌘ Command ⌃ Control ⌥ Option ⇧ Shift 二, 常用快捷键 文件快捷键 快捷键 键盘 描述 ⌘N command + N 新文件 ⇧⌘N ...
- CSS/CSS3常用的样式
强制文本显示 让一段文字在固定宽度在一行显示,最后一个字符为省略标记(...),css样式如下 单行显示语法:white-space:nowrap; div{ white-space:nowrap; ...
- centos R包 tidyverse安装
tidyverse安装失败,install.packages('tidyverse') 错误原因大概是其中有个依赖包xml2安装不上,解决办法是yum install libxml2-devel,这样 ...
- mysql_DML_select_升序降序去重
select *from wsb limit 5;显示前5行 select *from students LIMIT (m,n) (其中m是指记录开始的index,从0开始,表示第一条记录n是指 ...