Java LongPredicate 接口
最后修改时间:2025 年 4 月 16 日
java.util.function.LongPredicate 接口表示一个对一个 long 类型参数的谓词(布尔值函数)。它是一个函数式接口,具有单个抽象方法 test。
LongPredicate 是 Java 8 中添加的函数式编程实用程序的一部分。它专门用于 long 原语,以避免装箱开销。该接口提供了用于谓词组合的默认方法。
LongPredicate 接口概述
LongPredicate 包含一个抽象方法和几个默认方法。关键方法 test 在给定的 long 值上评估谓词。其他方法支持谓词之间的逻辑运算。
@FunctionalInterface
public interface LongPredicate {
boolean test(long value);
default LongPredicate and(LongPredicate other);
default LongPredicate or(LongPredicate other);
default LongPredicate negate();
}
以上代码显示了 LongPredicate 接口的结构。它使用 @FunctionalInterface 注解来表明其单个抽象方法的性质。默认方法支持谓词之间的逻辑运算。
LongPredicate 的基本用法
使用 LongPredicate 的最简单方法是使用 lambda 表达式。我们定义了用于测试 long 值的条件。示例检查数字是否为偶数。
package com.zetcode;
import java.util.function.LongPredicate;
public class Main {
public static void main(String[] args) {
// Check if number is even
LongPredicate isEven = n -> n % 2 == 0;
System.out.println("Is 10 even? " + isEven.test(10));
System.out.println("Is 15 even? " + isEven.test(15));
// Check if number is positive
LongPredicate isPositive = n -> n > 0;
System.out.println("Is -5 positive? " + isPositive.test(-5));
}
}
此示例演示了 LongPredicate 与 lambda 表达式的基本用法。我们创建了两个谓词:一个检查偶数,另一个检查正数。test 方法使用不同的值评估每个谓词。
使用 AND 组合谓词
and 方法允许使用逻辑 AND 组合两个谓词。两个谓词都必须返回 true,组合后的谓词才能返回 true。这使得可以从简单的条件创建复杂的条件。
package com.zetcode;
import java.util.function.LongPredicate;
public class Main {
public static void main(String[] args) {
LongPredicate isEven = n -> n % 2 == 0;
LongPredicate isGreaterThanTen = n -> n > 10;
// Combine predicates with AND
LongPredicate isEvenAndGreaterThanTen = isEven.and(isGreaterThanTen);
System.out.println("12: " + isEvenAndGreaterThanTen.test(12));
System.out.println("8: " + isEvenAndGreaterThanTen.test(8));
System.out.println("15: " + isEvenAndGreaterThanTen.test(15));
}
}
此示例显示了使用 and 组合谓词。我们检查数字是否既是偶数又大于 10。组合后的谓词仅在满足这两个条件时才返回 true。
使用 OR 组合谓词
or 方法使用逻辑 OR 组合两个谓词。任何一个谓词都可以返回 true,组合后的谓词就可以返回 true。这对于检查多个可能的条件很有用。
package com.zetcode;
import java.util.function.LongPredicate;
public class Main {
public static void main(String[] args) {
LongPredicate isNegative = n -> n < 0;
LongPredicate isGreaterThanHundred = n -> n > 100;
// Combine predicates with OR
LongPredicate isOutOfRange = isNegative.or(isGreaterThanHundred);
System.out.println("-5: " + isOutOfRange.test(-5));
System.out.println("50: " + isOutOfRange.test(50));
System.out.println("150: " + isOutOfRange.test(150));
}
}
此示例演示了使用 or 组合谓词。我们检查数字是负数还是大于 100。组合后的谓词在满足任何一个条件时返回 true。
否定谓词
negate 方法返回一个表示原始谓词逻辑否定的谓词。这等效于将逻辑 NOT 运算符应用于谓词的结果。
package com.zetcode;
import java.util.function.LongPredicate;
public class Main {
public static void main(String[] args) {
LongPredicate isPrime = n -> {
if (n < 2) return false;
for (long i = 2; i <= Math.sqrt(n); i++) {
if (n % i == 0) return false;
}
return true;
};
// Create negation of isPrime
LongPredicate isNotPrime = isPrime.negate();
System.out.println("7 is prime? " + isPrime.test(7));
System.out.println("8 is not prime? " + isNotPrime.test(8));
}
}
此示例显示了使用 negate 否定谓词。我们创建了一个素数检查器,然后对其取反以检查非素数。取反的谓词返回原始谓词的相反值。
将 LongPredicate 与 Streams 一起使用
LongPredicate 通常与 LongStream 一起用于过滤操作。filter 方法接受一个 LongPredicate,以包括与条件匹配的元素。这使得可以有效地处理 long 值。
package com.zetcode;
import java.util.stream.LongStream;
public class Main {
public static void main(String[] args) {
// Define a range of numbers
LongStream numbers = LongStream.rangeClosed(1, 20);
// Filter for numbers divisible by 3 or 5
LongPredicate divisibleBy3or5 = n -> n % 3 == 0 || n % 5 == 0;
System.out.println("Numbers divisible by 3 or 5:");
numbers.filter(divisibleBy3or5)
.forEach(System.out::println);
}
}
此示例演示了 LongPredicate 与 LongStream 的用法。我们创建了一个谓词来检查是否能被 3 或 5 整除,然后使用它来过滤一系列数字。过滤后的流仅包含匹配的值。
链接多个谓词
LongPredicate 的默认方法可以链接起来,以创建复杂的条件。这允许从简单的组件构建复杂的谓词,同时保持可读性。
package com.zetcode;
import java.util.function.LongPredicate;
public class Main {
public static void main(String[] args) {
LongPredicate isEven = n -> n % 2 == 0;
LongPredicate isPositive = n -> n > 0;
LongPredicate isTwoDigits = n -> n >= 10 && n <= 99;
// Chain multiple predicates
LongPredicate complexCondition = isPositive.and(isTwoDigits).and(isEven.negate());
System.out.println("25: " + complexCondition.test(25));
System.out.println("-5: " + complexCondition.test(-5));
System.out.println("12: " + complexCondition.test(12));
System.out.println("99: " + complexCondition.test(99));
}
}
此示例显示了链接多个谓词。我们检查正数、两位数、奇数。复杂的条件是通过使用 and 和 negate 操作组合更简单的谓词构建的。
实际示例:数字验证器
让我们使用 LongPredicate 创建一个实际的数字验证器。我们将结合几个验证规则来检查数字是否满足特定的业务需求。
package com.zetcode;
import java.util.function.LongPredicate;
public class Main {
public static void main(String[] args) {
// Define validation rules
LongPredicate isInAllowedRange = n -> n >= 1000 && n <= 9999;
LongPredicate isNotForbiddenNumber = n -> n != 1234 && n != 4321;
LongPredicate hasValidChecksum = n -> (n % 10 + n / 10 % 10) % 2 == 0;
// Combine all rules
LongPredicate isValidNumber = isInAllowedRange
.and(isNotForbiddenNumber)
.and(hasValidChecksum);
long[] testNumbers = {1234, 5678, 9999, 4321, 2468, 1001};
for (long num : testNumbers) {
System.out.printf("%d is valid: %b%n", num, isValidNumber.test(num));
}
}
}
此实际示例创建了一个具有多个规则的数字验证器。数字必须是 4 位数、不被禁止并且通过校验和测试。组合后的谓词在一个操作中有效地检查所有条件。
来源
在本文中,我们介绍了 Java LongPredicate 接口的基本方法和特性。理解这些概念对于在 Java 应用程序中使用原始 long 进行函数式编程和流处理至关重要。
作者
列出所有Java教程。