doublepredicate 是 java 8 提供的函数式接口,用于对 double 值执行布尔判断,需注意浮点精度问题及与 doublestream 的配合使用。

DoublePredicate 是 Java 8 引入的函数式接口,专用于对 double 类型值进行布尔判断,常配合 Stream<double></double> 或原始类型流(如 DoubleStream)做浮点数条件过滤。它只有一个抽象方法 test(double value),返回 boolean,用法简洁但需注意浮点精度问题。
直接创建 DoublePredicate 实例做简单判断
可用 lambda 表达式或方法引用快速定义判断逻辑,比如筛选大于 0.5 的浮点数:
-
DoublePredicate isPositive = d -> d > 0;—— 判断正数 DoublePredicate isInRange = d -> d >= 1.0 && d —— 判断区间-
DoublePredicate isNotNaN = Double::isFinite;—— 排除 NaN 和无穷大(推荐用Double.isFinite(d)而非!Double.isNaN(d),因后者不拦截Infinity)
在 DoubleStream 中结合 filter 使用
这是最典型的应用场景。注意:必须用 DoubleStream(而非 Stream<double></double>),才能直接传入 DoublePredicate:
DoubleStream.of(1.2, -0.5, 3.0, Double.NaN, 4.7)-
.filter(d -> d > 0 && Double.isFinite(d))—— 同时过滤负数、NaN 和无穷 -
.boxed().collect(Collectors.toList());—— 若需转成List<double></double>
若源头是 Stream<double></double>,需先用 mapToDouble(Double::doubleValue) 转为原始流,否则无法直接用 DoublePredicate。
处理浮点数精度问题的实用技巧
直接用 == 或 != 比较浮点数极易出错,应避免:
- ❌ 错误写法:
d == 0.1(二进制表示误差导致恒为 false) - ✅ 正确替代:
Math.abs(d - 0.1) (设定容差) - ✅ 封装成可复用的谓词:
DoublePredicate isEqualTo = target -> Math.abs(d - target) - ✅ 对零值判断,优先用
d == 0.0(因为 0.0 在 IEEE 754 中是精确表示)
组合多个条件(and / or / negate)
DoublePredicate 内置了默认方法,支持链式组合:
DoublePredicate positive = d -> d > 0;DoublePredicate finite = Double::isFinite;-
DoublePredicate validPositive = positive.and(finite);—— 两者同时满足 -
DoublePredicate notZero = finite.and(d -> Math.abs(d) > 1e-9);—— 有限且非零 -
DoublePredicate negativeOrNaN = positive.negate();—— 取反(含 NaN,注意逻辑)
注意:negate() 会把 NaN 的 test 结果也取反,而 Double.isFinite(NaN) 返回 false,所以 finite.negate().test(Double.NaN) 是 true,符合预期。
不复杂但容易忽略精度和类型匹配细节,用对了能写出干净高效的浮点过滤逻辑。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











