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 值进行测试的条件。示例检查数字是否为正数。
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。
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。
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
方法返回一个谓词,该谓词表示原始谓词的逻辑否定。它会反转布尔结果。
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 以包含流中的元素。
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 方法来创建复杂的条件。这使得可以从简单的谓词构建复杂的过滤器。
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 值创建可重用的验证规则。
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 接口的基本方法和特性。了解这些概念对于在函数式编程上下文中处理原始 double 值至关重要。
作者
列出所有Java教程。