在 Java 8 的函数式编程体系中,DoublePredicate 是一个接收原生 double 参数并返回 boolean 结果的函数式接口。它避免了使用 Predicate<Double> 时不可避免的自定装箱开销,非常适合对大量双精度浮点数做条件过滤。

DoublePredicate 的核心方法
DoublePredicate 位于 java.util.function 包中,主要包含以下几个抽象和默认方法:
test(double value):唯一抽象方法,判断传入的原生 double 是否满足条件。and(DoublePredicate other):逻辑与组合。or(DoublePredicate other):逻辑或组合。negate():逻辑非。
为什么不用 Predicate<Double>
Predicate<Double> 操作的是 Double 包装类型,在循环或流处理中会带来频繁的装箱和拆箱。DoublePredicate 直接处理原生类型,在数值密集场景下更加高效。
在 DoubleStream 中使用
DoubleStream 的 filter 方法正好接收 DoublePredicate,下面是一个过滤正数并计算平均值的示例:
import java.util.stream.DoubleStream;
public class DoublePredicateDemo {
public static void main(String[] args) {
double[] values = { -1.5, 2.3, 0.0, 4.8, -3.2, 5.1 };
// 使用 DoublePredicate 过滤大于 0 的原生 double
DoublePredicate positive = d -> d > 0;
DoubleStream stream = DoubleStream.of(values).filter(positive);
double avg = stream.average().orElse(0.0);
System.out.println("正数平均值: " + avg);
}
}
组合多个过滤条件
可以利用默认方法进行条件组合,例如筛选区间 (0, 5] 内的数值:
import java.util.function.DoublePredicate;
public class CombineDemo {
public static void main(String[] args) {
DoublePredicate greaterThanZero = d -> d > 0;
DoublePredicate lessOrEqualFive = d -> d <= 5;
DoublePredicate inRange = greaterThanZero.and(lessOrEqualFive);
double[] data = { -1.0, 1.2, 5.0, 6.3, 3.4 };
for (double v : data) {
if (inRange.test(v)) {
System.out.println(v + " 在范围内");
}
}
}
}
与数组遍历结合
如果不使用流,也可以直接把 DoublePredicate 当作参数传递给自定义方法:
import java.util.function.DoublePredicate;
public class ArrayFilter {
public static void filter(double[] arr, DoublePredicate p) {
for (double v : arr) {
if (p.test(v)) {
System.out.print(v + " ");
}
}
System.out.println();
}
public static void main(String[] args) {
double[] nums = { 1.1, 2.2, 3.3, 4.4 };
filter(nums, d -> d % 2 == 0); // 无实际小数取模意义,仅演示
}
}
小结
DoublePredicate 是 Java 为原生 double 过滤逻辑提供的轻量工具。当你的数据是基础类型 double 且关注性能时,优先选择 DoublePredicate 而不是 Predicate<Double>,配合 DoubleStream 能写出简洁且高效的数值处理代码。
DoublePredicateJava原生double过滤修改时间:2026-07-26 03:42:09