ZetCode

Java DoublePredicate 接口

最后修改时间:2025 年 4 月 16 日

java.util.function.DoublePredicate 接口表示一个针对双精度浮点值参数的谓词(布尔值函数)。它是一个函数式接口,具有单个抽象方法 test

DoublePredicate 是 Java 8 中添加的函数式编程工具的一部分。它专门针对 double 原始类型,以避免装箱开销。该接口提供了用于逻辑运算的默认方法。

DoublePredicate 接口概述

DoublePredicate 包含一个抽象方法和三个默认方法。关键方法 test 在给定参数上评估谓词。其他方法启用谓词的逻辑组合。

@FunctionalInterface
public interface DoublePredicate {
    boolean test(double value);
    
    default DoublePredicate and(DoublePredicate other);
    default DoublePredicate negate();
    default DoublePredicate or(DoublePredicate other);
}

上面的代码显示了 DoublePredicate 接口的结构。它作用于原始的 double 值。该接口使用 @FunctionalInterface 进行注解,以表明其单一抽象方法的性质。

DoublePredicate 的基本用法

使用 DoublePredicate 的最简单方法是使用 lambda 表达式。我们定义了要针对 double 值进行测试的条件。示例检查数字是否为正数。

Main.java
package com.zetcode;

import java.util.function.DoublePredicate;

public class Main {

    public static void main(String[] args) {

        // Define a predicate that tests if a number is positive
        DoublePredicate isPositive = n -> n > 0;
        
        // Test the predicate
        System.out.println("5.0 is positive: " + isPositive.test(5.0));
        System.out.println("-3.2 is positive: " + isPositive.test(-3.2));
        System.out.println("0.0 is positive: " + isPositive.test(0.0));
    }
}

此示例演示了使用 lambda 表达式的基本 DoublePredicate 用法。isPositive 谓词测试一个数字是否大于零。我们将其应用于不同的值以查看布尔结果。

使用 AND 组合谓词

and 方法允许使用逻辑 AND 组合两个谓词。两个谓词都必须计算为 true,组合后的谓词才能返回 true。

Main.java
package com.zetcode;

import java.util.function.DoublePredicate;

public class Main {

    public static void main(String[] args) {

        // Define individual predicates
        DoublePredicate isPositive = n -> n > 0;
        DoublePredicate isWholeNumber = n -> n == Math.floor(n);
        
        // Combine with AND
        DoublePredicate isPositiveWhole = isPositive.and(isWholeNumber);
        
        System.out.println("5.0 is positive whole: " + isPositiveWhole.test(5.0));
        System.out.println("3.14 is positive whole: " + isPositiveWhole.test(3.14));
        System.out.println("-2.0 is positive whole: " + isPositiveWhole.test(-2.0));
    }
}

此示例显示了使用 and 进行的谓词组合。组合后的谓词检查一个数字是否既是正数又是整数。只有满足这两个条件的数字才会返回 true。

使用 OR 组合谓词

or 方法使用逻辑 OR 组合两个谓词。任何一个谓词计算为 true 都会使组合后的谓词返回 true。

Main.java
package com.zetcode;

import java.util.function.DoublePredicate;

public class Main {

    public static void main(String[] args) {

        // Define individual predicates
        DoublePredicate isNegative = n -> n < 0;
        DoublePredicate isGreaterThan100 = n -> n > 100;
        
        // Combine with OR
        DoublePredicate isNegativeOrLarge = isNegative.or(isGreaterThan100);
        
        System.out.println("-5.0 matches: " + isNegativeOrLarge.test(-5.0));
        System.out.println("150.0 matches: " + isNegativeOrLarge.test(150.0));
        System.out.println("50.0 matches: " + isNegativeOrLarge.test(50.0));
    }
}

此示例演示了使用 or 进行的谓词组合。组合后的谓词检查一个数字是负数还是大于 100。满足任一条件的数字都会返回 true。

否定谓词

negate 方法返回一个谓词,该谓词表示原始谓词的逻辑否定。它会反转布尔结果。

Main.java
package com.zetcode;

import java.util.function.DoublePredicate;

public class Main {

    public static void main(String[] args) {

        // Original predicate
        DoublePredicate isEven = n -> n % 2 == 0;
        
        // Negated predicate
        DoublePredicate isOdd = isEven.negate();
        
        System.out.println("4.0 is odd: " + isOdd.test(4.0));
        System.out.println("7.0 is odd: " + isOdd.test(7.0));
        System.out.println("0.0 is odd: " + isOdd.test(0.0));
    }
}

此示例显示了使用 negate 进行的谓词否定。我们创建一个 isEven 谓词,然后对其进行否定以获得 isOdd。否定的谓词对奇数返回 true,对偶数返回 false。

将 DoublePredicate 与 Streams 结合使用

DoublePredicate 通常与 DoubleStream 结合使用以进行过滤操作。filter 方法接受一个 DoublePredicate 以包含流中的元素。

Main.java
package com.zetcode;

import java.util.Arrays;
import java.util.stream.DoubleStream;

public class Main {

    public static void main(String[] args) {

        double[] values = {1.5, -2.3, 4.7, 0.0, 10.2, -5.6, 7.8};
        
        // Define predicate for filtering
        DoublePredicate inRange = n -> n >= 0 && n <= 10;
        
        // Filter stream using predicate
        double[] filtered = DoubleStream.of(values)
            .filter(inRange)
            .toArray();
            
        System.out.println("Original: " + Arrays.toString(values));
        System.out.println("Filtered: " + Arrays.toString(filtered));
    }
}

此示例显示了 DoublePredicate 与 DoubleStream 的用法。我们定义了一个范围检查谓词,并使用它来过滤值。只有介于 0 和 10(含)之间的数字才能通过过滤器。

链接多个谓词

可以链接 DoublePredicate 方法来创建复杂的条件。这使得可以从简单的谓词构建复杂的过滤器。

Main.java
package com.zetcode;

import java.util.function.DoublePredicate;

public class Main {

    public static void main(String[] args) {

        // Define base predicates
        DoublePredicate isPositive = n -> n > 0;
        DoublePredicate hasFraction = n -> n != Math.floor(n);
        DoublePredicate notTooLarge = n -> n < 100;
        
        // Chain predicates
        DoublePredicate complexCondition = isPositive
            .and(hasFraction)
            .and(notTooLarge);
        
        System.out.println("3.14 matches: " + complexCondition.test(3.14));
        System.out.println("5.0 matches: " + complexCondition.test(5.0));
        System.out.println("150.5 matches: " + complexCondition.test(150.5));
        System.out.println("-2.7 matches: " + complexCondition.test(-2.7));
    }
}

此示例演示了谓词链。我们组合了三个条件:正数、有小数部分且不太大。复杂的条件仅匹配满足所有三个条件的数字。

实际示例:数据验证

DoublePredicate 适用于数据验证场景。我们可以在业务逻辑中为 double 值创建可重用的验证规则。

Main.java
package com.zetcode;

import java.util.function.DoublePredicate;

public class Main {

    public static void main(String[] args) {

        // Define validation predicates
        DoublePredicate isValidTemperature = t -> t >= -50 && t <= 50;
        DoublePredicate isValidPercentage = p -> p >= 0 && p <= 100;
        
        // Test values
        double[] temps = {25.5, -60.2, 45.0, 55.1};
        double[] percents = {75.3, -5.0, 100.0, 101.5};
        
        System.out.println("Temperature validation:");
        for (double t : temps) {
            System.out.printf("%.1f°C: %s%n", t, isValidTemperature.test(t));
        }
        
        System.out.println("\nPercentage validation:");
        for (double p : percents) {
            System.out.printf("%.1f%%: %s%n", p, isValidPercentage.test(p));
        }
    }
}

此实际示例显示了 DoublePredicate 在数据验证中的应用。我们定义了有效温度和百分比的规则。然后使用谓词来验证值数组,演示了实际应用性。

来源

Java DoublePredicate 接口文档

在本文中,我们介绍了 Java DoublePredicate 接口的基本方法和特性。了解这些概念对于在函数式编程上下文中处理原始 double 值至关重要。

作者

我叫 Jan Bodnar,是一位经验丰富的程序员,在这个领域拥有多年的经验。我从 2007 年开始撰写编程文章,至今已撰写了 1400 多篇文章和八本电子书。凭借超过八年的教学经验,我致力于分享我的知识并帮助其他人掌握编程概念。

列出所有Java教程