ZetCode

Java IntPredicate 接口

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

java.util.function.IntPredicate 接口表示接受 int 值参数的谓词。它是一个函数式接口,只有一个抽象方法 test。 IntPredicate 常用作对基本类型 int 流的过滤操作。

IntPredicate 是 Java 8 中添加的 Java 函数式编程实用程序的一部分。它为基本类型 int 值启用行为参数化。该接口提供了用于谓词组合和链式操作的默认方法。

IntPredicate 接口概述

IntPredicate 接口包含一个抽象方法和几个默认方法。关键方法 test 在输入上评估谓词。其他方法允许谓词之间的逻辑运算。

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

上面的代码显示了 IntPredicate 接口的结构。它对基本类型 int 值进行操作,以避免装箱开销。该接口使用 @FunctionalInterface 进行注解,以表明其单一抽象方法的特性。

IntPredicate 的基本用法

使用 IntPredicate 最简单的方法是使用 lambda 表达式。我们定义要在输入值上测试的条件。该示例检查数字是否为偶数。

Main.java
package com.zetcode;

import java.util.function.IntPredicate;

public class Main {

    public static void main(String[] args) {

        // Define a predicate that tests if a number is even
        IntPredicate isEven = n -> n % 2 == 0;
        
        // Test the predicate
        System.out.println("Is 4 even? " + isEven.test(4));
        System.out.println("Is 7 even? " + isEven.test(7));
        
        // Predicate for numbers greater than 10
        IntPredicate isGreaterThan10 = n -> n > 10;
        System.out.println("Is 15 > 10? " + isGreaterThan10.test(15));
    }
}

此示例演示了使用 lambda 表达式的 IntPredicate 的基本用法。isEven 谓词检查一个数字是否能被 2 整除。我们用不同的值来测试它。isGreaterThan10 显示了另一个简单的条件。

使用 AND 组合谓词

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

Main.java
package com.zetcode;

import java.util.function.IntPredicate;

public class Main {

    public static void main(String[] args) {

        // Define individual predicates
        IntPredicate isEven = n -> n % 2 == 0;
        IntPredicate isGreaterThan10 = n -> n > 10;
        
        // Combine with AND
        IntPredicate isEvenAndGreaterThan10 = isEven.and(isGreaterThan10);
        
        System.out.println("12: " + isEvenAndGreaterThan10.test(12));
        System.out.println("8: " + isEvenAndGreaterThan10.test(8));
        System.out.println("15: " + isEvenAndGreaterThan10.test(15));
    }
}

此示例显示了使用 and 的谓词组合。组合谓词检查一个数字是否既是偶数又大于 10。在我们的测试用例中,只有 12 满足这两个条件。

使用 OR 组合谓词

or 方法使用逻辑 OR 组合两个谓词。组合谓词可以为 true 返回 true。

Main.java
package com.zetcode;

import java.util.function.IntPredicate;

public class Main {

    public static void main(String[] args) {

        // Define individual predicates
        IntPredicate isNegative = n -> n < 0;
        IntPredicate isDivisibleBy3 = n -> n % 3 == 0;
        
        // Combine with OR
        IntPredicate isNegativeOrDivisibleBy3 = isNegative.or(isDivisibleBy3);
        
        System.out.println("-5: " + isNegativeOrDivisibleBy3.test(-5));
        System.out.println("9: " + isNegativeOrDivisibleBy3.test(9));
        System.out.println("7: " + isNegativeOrDivisibleBy3.test(7));
    }
}

此示例演示了使用 or 的谓词组合。组合谓词检查一个数字是负数还是能被 3 整除。-5 和 9 满足至少一个条件,而 7 哪个条件也不满足。

否定谓词

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

Main.java
package com.zetcode;

import java.util.function.IntPredicate;

public class Main {

    public static void main(String[] args) {

        // Original predicate
        IntPredicate isPrime = n -> {
            if (n < 2) return false;
            for (int i = 2; i <= Math.sqrt(n); i++) {
                if (n % i == 0) return false;
            }
            return true;
        };
        
        // Negated predicate
        IntPredicate isNotPrime = isPrime.negate();
        
        System.out.println("Is 7 prime? " + isPrime.test(7));
        System.out.println("Is 8 not prime? " + isNotPrime.test(8));
    }
}

此示例显示了使用 negate 的谓词否定。isPrime 谓词检查素数,而 isNotPrime 反转此逻辑。结果演示了否定操作。

将 IntPredicate 与 IntStream 一起使用

IntPredicate 常用作 IntStream 的过滤操作。filter 方法接受一个 IntPredicate,仅包含匹配的元素。这可以高效地处理基本类型 int 流。

Main.java
package com.zetcode;

import java.util.stream.IntStream;

public class Main {

    public static void main(String[] args) {

        // Define a predicate for perfect squares
        IntPredicate isPerfectSquare = n -> {
            int sqrt = (int) Math.sqrt(n);
            return sqrt * sqrt == n;
        };
        
        // Filter a range of numbers
        System.out.println("Perfect squares between 1 and 100:");
        IntStream.rangeClosed(1, 100)
            .filter(isPerfectSquare)
            .forEach(System.out::println);
    }
}

此示例显示了 IntPredicate 与 IntStream 的用法。我们定义一个谓词来识别完全平方数,然后使用它来过滤从 1 到 100 的数字。流管道仅打印满足条件的数字。

链接多个谓词

可以链接 IntPredicate 方法以从简单的谓词创建复杂的条件。这种方法提高了代码的可读性和可维护性。

Main.java
package com.zetcode;

import java.util.function.IntPredicate;

public class Main {

    public static void main(String[] args) {

        // Define base predicates
        IntPredicate isEven = n -> n % 2 == 0;
        IntPredicate isPositive = n -> n > 0;
        IntPredicate isTwoDigits = n -> n >= 10 && n <= 99;
        
        // Chain predicates
        IntPredicate complexCondition = isPositive
            .and(isTwoDigits)
            .and(isEven.negate());
        
        System.out.println("15: " + complexCondition.test(15));
        System.out.println("22: " + complexCondition.test(22));
        System.out.println("105: " + complexCondition.test(105));
    }
}

此示例演示了链接多个 IntPredicate 操作。complexCondition 检查正的、两位数的奇数。每个测试用例显示了不同条件组合的评估方式。

方法引用作为 IntPredicate

当现有方法满足函数式接口要求时,可以使用方法引用来创建 IntPredicate 实例。这提供了简洁的语法。

Main.java
package com.zetcode;

import java.util.function.IntPredicate;

public class NumberUtils {
    
    public static boolean isPalindrome(int number) {
        String s = Integer.toString(number);
        return new StringBuilder(s).reverse().toString().equals(s);
    }
}

public class Main {

    public static void main(String[] args) {

        // Method reference as IntPredicate
        IntPredicate isPalindrome = NumberUtils::isPalindrome;
        
        System.out.println("1221: " + isPalindrome.test(1221));
        System.out.println("1234: " + isPalindrome.test(1234));
    }
}

此示例显示了将方法引用用作 IntPredicate。NumberUtils.isPalindrome 方法检查一个数字是否正反读都一样。我们引用此方法来创建一个谓词实例。

来源

Java IntPredicate 接口文档

在本文中,我们介绍了 Java IntPredicate 接口的基本方法和特性。理解这些概念对于在 Java 中进行函数式编程和使用基本类型 int 处理流至关重要。

作者

我叫 Jan Bodnar,是一位经验丰富的程序员。我于 2007 年开始撰写编程文章,此后撰写了 1,400 多篇文章和 8 本电子书。凭借超过八年的教学经验,我致力于分享我的知识,帮助他人掌握编程概念。

列出所有Java教程