Java8 教程

Java8 内置函数式接口 Predicate

Predicate 是 Java8 中的函数式接口,它代表一个断言,用来对输入的参数进行判断,返回一个 boolean 值。它通常用于过滤、筛选或者判断某个条件是否满足。

Predicate 接口只有一个抽象方法:boolean test(T t),该方法用于对输入的参数进行判断,并返回一个 boolean 值。

使用 Predicate 接口可以方便地实现一些条件判断的需求,例如在对集合进行筛选时,判断某个元素是否满足特定条件。另外,它也可以作为方法的参数,用于接收一个条件判断的函数。

Predicate 定义

Predicate 接口定义如下:

package java.util.function;

import java.util.Objects;

/**
* 代表一个参数断言(布尔值函数)。
* 这是一个功能接口,它的功能方法是 test(Object)。
*
* @param <T> 断言的输入类型
* @since 1.8
*/
@FunctionalInterface
public interface Predicate<T> {

   /**
    * 根据给定参数计算此断言
    *
    * @param t 输入参数
    * @return 如果输入参数匹配谓词,返回 true。否则,返回 false
    */
   boolean test(T t);

   /**
    * 返回一个组合断言,表示此断言与另一断言的短路逻辑 AND。 在评估组合断言时,如果此断言为 false,则不评估 other 断言。
    *
    * 在评估任一断言时抛出的任何异常都会转发给调用者;如果评估该断言时抛出异常,则不会评估 other 断言。
    *
    * @param other 将与该断言进行逻辑 AND 的断言
    * @return 组和的断言,表示该断言与 other 断言的短路逻辑 AND
    * @throws 如果对方为空,则出现 NullPointerException 异常
    */
   default Predicate<T> and(Predicate<? super T> other) {
       Objects.requireNonNull(other);
       return (t) -> test(t) && other.test(t);
   }

   /**
    * 返回表示该断言逻辑的否定断言。
    *
    * @return 表示该断言逻辑否定的断言
    */
   default Predicate<T> negate() {
       return (t) -> !test(t);
   }

   /**
    * 返回一个组合断言,表示此断言与另一断言的短路逻辑 OR。 在评估组合断言时,如果此断言为 true,则不评估 other 断言。
    *
    * 在评估任一断言时抛出的任何异常都会转发给调用者;如果评估该断言时抛出异常,则不会评估 other 断言。
    *
    * @param other 与该断言逻辑 OR 的断言
    * @return 组成的断言,表示该断言和 other 断言的短路逻辑 OR
    * @throws 如果对方为空,则出现 NullPointerException 异常
    */
   default Predicate<T> or(Predicate<? super T> other) {
       Objects.requireNonNull(other);
       return (t) -> test(t) || other.test(t);
   }

   /**
    * 返回一个 Predicate,该断言根据 Objects#equals(Object, Object) 测试两个参数是否相等。
    *
    * @param <T> 断言的参数类型
    * @param targetRef 对象引用,与之进行等价比较,可以是 null
    * @return 断言,根据 Objects#equals(Object, Object) 测试两个参数是否相等。
    */
   static <T> Predicate<T> isEqual(Object targetRef) {
       return (null == targetRef)
               ? Objects::isNull
               : object -> targetRef.equals(object);
   }
}

Predicate 示例

Predicate 简单示例

该示例将输入一个字符串,使用 Predicate 判断字符串中是否包含 w 或 W 字符。

匿名类实现方式

package com.hxstrive.jdk8.function_interface;

import java.util.function.Predicate;

/**
* Predicate 函数式接口
* @author hxstrive.com
*/
public class PredicateDemo {

   public static void main(String[] args) {
       Predicate<String> predicate = new Predicate<String>() {
           @Override
           public boolean test(String s) {
               // 判断字符串是否包含 w 或 W
               return s.toLowerCase().contains("w");
           }
       };
       System.out.println(predicate.test("hello world"));
   }

}

运行示例,输出如下:

true

Lambda实现方式

package com.hxstrive.jdk8.function_interface;

import java.util.function.Predicate;

/**
* Predicate 函数式接口
* @author hxstrive.com
*/
public class PredicateDemo2 {

   public static void main(String[] args) {
       Predicate<String> predicate = s -> {
           // 判断字符串是否包含 w 或 W
           return s.toLowerCase().contains("w");
       };
       System.out.println(predicate.test("hello world"));
   }

}

运行示例,输出如下:

true

Predicate 逻辑与示例

该示例将创建两个断言,两个断言是逻辑与的关系。通过这两个断言判断字符串中是否同时包含了 w 和 o 字符。如下:

package com.hxstrive.jdk8.function_interface;

import java.util.function.Predicate;

/**
* Predicate 函数式接口
* @author hxstrive.com
*/
public class PredicateDemo3 {

   public static void main(String[] args) {
       Predicate<String> predicate = s -> {
           // 判断字符串是否包含 w 或 W
           System.out.println("(1) 判断字符串是否包含 w 或 W");
           return s.toLowerCase().contains("w");
       };

       predicate = predicate.and(s -> {
           // 继续判断字符串是否包含 o 或 O
           System.out.println("(2) 继续判断字符串是否包含 o 或 O");
           return s.toLowerCase().contains("o");
       });

       System.out.println(predicate.test("hello world"));
   }

}

运行示例,输出如下:

(1) 判断字符串是否包含 w 或 W
(2) 继续判断字符串是否包含 o 或 O
true

Predicate 逻辑或示例

该示例将创建两个断言,两个断言是逻辑或的关系。通过这两个断言判断字符串中是否包含了 w 或 o 字符。如下:

package com.hxstrive.jdk8.function_interface;

import java.util.function.Predicate;

/**
* Predicate 函数式接口
* @author hxstrive.com
*/
public class PredicateDemo4 {

   public static void main(String[] args) {
       Predicate<String> predicate = s -> {
           // 判断字符串是否包含 w 或 W
           System.out.println("(1) 判断字符串是否包含 w 或 W");
           return s.toLowerCase().contains("w");
       };

       predicate = predicate.or(s -> {
           // 继续判断字符串是否包含 o 或 O
           System.out.println("(2) 继续判断字符串是否包含 o 或 O");
           return s.toLowerCase().contains("o");
       });

       System.out.println(predicate.test("hello world"));
   }

}

运行示例,输出如下:

(1) 判断字符串是否包含 w 或 W
true
说说我的看法
全部评论(
没有评论
关于
本网站专注于 Java、数据库(MySQL、Oracle)、Linux、软件架构及大数据等多领域技术知识分享。涵盖丰富的原创与精选技术文章,助力技术传播与交流。无论是技术新手渴望入门,还是资深开发者寻求进阶,这里都能为您提供深度见解与实用经验,让复杂编码变得轻松易懂,携手共赴技术提升新高度。如有侵权,请来信告知:hxstrive@outlook.com
公众号