JDK8新特性-java.util.function-Predicate接口

本文详细介绍了 Java 中 Predicate 接口的功能与用法,包括其基本方法如 test(), and(), or(), negate() 和静态方法 isEqual() 的实现原理及实际应用示例。

上篇主要对Function函数进行了简单了解,本篇则主要了解Predicate。该函数的主要作用其实就是判定输入的对象是否否和某个条件,然后将其布尔值返回。
主要使用方法如下:

//唯一的抽象方法
boolean test(T t);
//且操作,既满足A也满足B条件
default Predicate<T> and(Predicate<? super T> other) {
        Objects.requireNonNull(other);
        return (t) -> test(t) && other.test(t);
    }
//取反操作 为true则返回false
 default Predicate<T> negate() {
        return (t) -> !test(t);
    }
//或操作,满足A条件或者满足B条件
 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);
    }

除了test()抽象方法以及一个静态方法以外,其他的都是默认方法,可以存在多个默认方法以及静态方法。
实践操作如下:

  public static void main(String[] args) {
        Predicate<Integer> biggerThan6 = x -> x > 6;
        Predicate<Integer> lessThan3 = x -> x < 3;
        Predicate<Integer> lessThan9 = x -> x < 9;
        //76大为true,为false
        System.out.println("negate value=" + biggerThan6.negate().test(7));
        //76大为true
        System.out.println("test() value=" + biggerThan6.test(7));
        //86大且比9小
        System.out.println("and value=" + biggerThan6.and(lessThan9).test(8));
        //13小,满足一种条件
        System.out.println("or value=" + biggerThan6.or(lessThan3).test(1));
        //静态方法,判定是否相等
        System.out.println("isEqual false value=" + Predicate.isEqual("test").test("num"));
        System.out.println("isEqual true value=" + Predicate.isEqual("num").test("num"));
    }

返回值:

negate value=false
test() value=true
and value=true
or value=true
isEqual false value=false
isEqual true value=true

大多数标准的函数式接口都拥有用来生成或组合函数的非抽象方法。例如Predicate.isEqual(“test”)同”test”.equals一样(”test”位置的值不为null).
使用方式很简单,下篇则介绍剩余的几个常用函数式接口。

转载于:https://www.cnblogs.com/huohuoL/p/10545436.html

### Java `util.function` 功能与使用教程 #### 1. 背景介绍 自 JDK 1.8 发布以来,Java 引入了 Lambda 表达式以及支持函数式编程的相关特性。为了更好地支持这些新特性和简化开发流程,Java 提供了一个新的——`java.util.function`[^1]。 该主要含了各种用于函数式编程的基础接口,它们被设计成可以作为 lambda 表达式的靶向类型(target type),从而使得开发者能够更方便地编写简洁而高效的代码[^2]。 --- #### 2. 常见接口及其用途 以下是 `java.util.function` 中一些常用的函数式接口: ##### (1) **Function<T, R>** 表示接受一个参数并返回结果的函数。此接口的主要方法是 `apply(T t)`,它会应用给定的操作于输入对象,并返回计算后的结果[^3]。 ```java import java.util.function.Function; public class Example { public static void main(String[] args) { Function<String, Integer> stringLength = s -> s.length(); System.out.println(stringLength.apply("Hello")); // 输出: 5 } } ``` ##### (2) **Predicate<T>** 代表一种布尔值判断逻辑,通常用来测试某个条件是否满足。核心方法为 `test(T t)`,如果指定的对象符合内部定义的标准,则返回 true;否则 false。 ```java import java.util.function.Predicate; public class PredicateExample { public static void main(String[] args) { Predicate<Integer> isEven = n -> n % 2 == 0; System.out.println(isEven.test(4)); // 输出: true } } ``` ##### (3) **Consumer<T>** 执行只读操作而不改变数据本身的行为模式。典型的方法有 `accept(T t)` 和默认实现的 `andThen()` 方法来组合多个消费者实例一起工作。 ```java import java.util.function.Consumer; public class ConsumerExample { public static void main(String[] args) { Consumer<String> printer = str -> System.out.print(str); printer.accept("World "); // 输出: World } } ``` ##### (4) **Supplier<T>** 提供无参调用即可获取某种类型的实例化对象的方式。它的唯一抽象方法叫做 `get()`,没有任何形参列表却总是要产生一个新的 T 类型的结果。 ```java import java.util.Random; import java.util.function.Supplier; public class SupplierExample { public static void main(String[] args) { Supplier<Double> randomValueGenerator = () -> Math.random() * 100d; double value = randomValueGenerator.get(); System.out.printf("%.2f%n",value); // 随机数输出示例 } } ``` ##### (5) **BiFunction<T,U,R>** 类似于 Function 接口但是接收两个不同类型的参数而不是单一的一个。其 apply 方法签名变为 `(T t, U u)` 形式。 ```java import java.util.function.BiFunction; public class BiFunctionExample { public static void main(String[] args){ BiFunction<Integer,Integer,Integer> adder=(a,b)-> a+b ; int sum=adder.apply(7 ,9 ); System.out.println(sum );// 输出 :16 } } ``` --- #### 3. 如何解决找不到 `java.util.function.Function` 的问题? 当遇到 “无法访问 `java.util.function.Function` 找不到 `java.util.function.Function` 的类文件”的错误提示时,可能是因为当前项目的编译器设置不兼容 JDK 1.8 或更高版本所致。可以通过修改 Maven 构建工具中的配置文件(pom.xml) 来调整源码级别(source level) 及目标字节码等级(target bytecode version)[^4]: ```xml <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.1</version> <configuration> <source>1.8</source> <target>1.8</target> </configuration> </plugin> </plugins> </build> ``` --- #### 4. 总结 通过学习上述内容可知,`java.util.function` 是一个非常重要的库集合,极大地增强了 Java 对现代程序设计理念的支持程度。利用其中预置的各种功能性接口配合 lambdas 技术可以让我们的编码过程更加流畅自然. ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值