ZetCode

Java IntBinaryOperator 接口

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

java.util.function.IntBinaryOperator 接口表示对两个 int 值操作数执行操作,生成一个 int 值结果。它是一个函数式接口,具有一个抽象方法 applyAsInt

IntBinaryOperator 是 Java 8 中添加的 Java 函数式编程实用程序的一部分。它专门用于原始 int 类型,以避免装箱开销。该接口通常用于数值运算和归约。

IntBinaryOperator 接口概述

IntBinaryOperator 接口包含一个抽象方法,该方法接受两个 int 参数并返回一个 int 值。与泛型函数式接口不同,它直接使用原始值,以获得更好的性能。

@FunctionalInterface
public interface IntBinaryOperator {
    int applyAsInt(int left, int right);
}

上面的代码显示了 IntBinaryOperator 的简单结构。它用 @FunctionalInterface 注释,并且只有一个方法需要实现。该方法接受两个 int 参数并返回一个 int 结果。

IntBinaryOperator 的基本用法

使用 IntBinaryOperator 的最简单方法是使用 lambda 表达式。我们定义了如何将两个 int 值组合成一个结果。此示例显示了加法。

Main.java
package com.zetcode;

import java.util.function.IntBinaryOperator;

public class Main {

    public static void main(String[] args) {

        // Define an addition operator
        IntBinaryOperator add = (a, b) -> a + b;
        
        // Apply the operator
        System.out.println("5 + 3 = " + add.applyAsInt(5, 3));
        System.out.println("10 + 20 = " + add.applyAsInt(10, 20));
        
        // Define a multiplication operator
        IntBinaryOperator multiply = (x, y) -> x * y;
        System.out.println("7 * 6 = " + multiply.applyAsInt(7, 6));
    }
}

此示例演示了使用 lambda 表达式的 IntBinaryOperator 的基本用法。我们创建了两个操作符:一个用于加法,一个用于乘法。每个操作符都接受两个 int 值并返回它们的组合结果。

将 IntBinaryOperator 与 reduce 一起使用

IntBinaryOperator 通常与原始整数流上的 reduce 操作一起使用。该操作符定义了如何在归约过程中组合元素。

Main.java
package com.zetcode;

import java.util.Arrays;
import java.util.function.IntBinaryOperator;

public class Main {

    public static void main(String[] args) {

        int[] numbers = {1, 2, 3, 4, 5};
        
        // Define a sum operator
        IntBinaryOperator sumOperator = (a, b) -> a + b;
        
        // Reduce the array to a single sum
        int sum = Arrays.stream(numbers)
            .reduce(0, sumOperator);
            
        System.out.println("Sum of numbers: " + sum);
        
        // Define a max operator
        IntBinaryOperator maxOperator = (a, b) -> a > b ? a : b;
        
        // Find maximum value
        int max = Arrays.stream(numbers)
            .reduce(Integer.MIN_VALUE, maxOperator);
            
        System.out.println("Max value: " + max);
    }
}

此示例显示了 IntBinaryOperator 与流归约一起使用。我们定义了两个操作符:一个用于对值求和,一个用于查找最大值。reduce 操作将操作符累积地应用于所有元素。

自定义数学运算

我们可以使用 IntBinaryOperator 实现更复杂的数学运算。此示例演示了幂运算和 GCD(最大公约数)。

Main.java
package com.zetcode;

import java.util.function.IntBinaryOperator;

public class Main {

    public static void main(String[] args) {

        // Power calculation
        IntBinaryOperator power = (base, exponent) -> {
            int result = 1;
            for (int i = 0; i < exponent; i++) {
                result *= base;
            }
            return result;
        };
        
        System.out.println("2^5 = " + power.applyAsInt(2, 5));
        
        // GCD calculation using Euclidean algorithm
        IntBinaryOperator gcd = (a, b) -> {
            while (b != 0) {
                int temp = b;
                b = a % b;
                a = temp;
            }
            return a;
        };
        
        System.out.println("GCD of 54 and 24: " + gcd.applyAsInt(54, 24));
    }
}

此示例实现了两个自定义数学运算。幂运算符计算底数的指数次幂。GCD 运算符实现了欧几里得算法。两者都展示了 IntBinaryOperator 如何封装复杂的逻辑。

与其他函数式接口组合

IntBinaryOperator 可以与其他函数式接口结合使用,以创建更强大的操作。此示例显示了与 IntPredicate 的组合。

Main.java
package com.zetcode;

import java.util.function.IntBinaryOperator;
import java.util.function.IntPredicate;

public class Main {

    public static void main(String[] args) {

        // Conditional sum - only add if both numbers are even
        IntBinaryOperator conditionalSum = (a, b) -> {
            IntPredicate isEven = n -> n % 2 == 0;
            return isEven.test(a) && isEven.test(b) ? a + b : 0;
        };
        
        System.out.println("Sum if even (4,6): " + 
            conditionalSum.applyAsInt(4, 6));
        System.out.println("Sum if even (3,8): " + 
            conditionalSum.applyAsInt(3, 8));
            
        // Safe division - avoid division by zero
        IntBinaryOperator safeDivide = (a, b) -> {
            return b != 0 ? a / b : 0;
        };
        
        System.out.println("10 / 2 = " + safeDivide.applyAsInt(10, 2));
        System.out.println("10 / 0 = " + safeDivide.applyAsInt(10, 0));
    }
}

此示例演示了将 IntBinaryOperator 与其他函数式接口结合使用。conditionalSum 仅在两个数字都为偶数时才相加。safeDivide 运算符优雅地处理了除以零的情况。

常用操作的工厂方法

我们可以创建返回常用 IntBinaryOperator 实例的工厂方法。这种方法促进了代码重用并遵循了工厂模式。

Main.java
package com.zetcode;

import java.util.function.IntBinaryOperator;

public class Main {
    
    public static IntBinaryOperator createAdder(int increment) {
        return (a, b) -> a + b + increment;
    }
    
    public static IntBinaryOperator createMultiplier(int factor) {
        return (a, b) -> a * b * factor;
    }

    public static void main(String[] args) {

        // Create customized operators
        IntBinaryOperator addWithBonus = createAdder(5);
        IntBinaryOperator multiplyWithFactor = createMultiplier(2);
        
        System.out.println("Add with bonus: " + 
            addWithBonus.applyAsInt(10, 20));
        System.out.println("Multiply with factor: " + 
            multiplyWithFactor.applyAsInt(3, 4));
            
        // Compose operations
        int result = addWithBonus.andThen(r -> r * 2)
            .applyAsInt(10, 20);
        System.out.println("Composed result: " + result);
    }
}

此示例显示了创建自定义 IntBinaryOperator 实例的工厂方法。createAdder 方法返回一个将添加红利的操作符。createMultiplier 包含一个额外的因子。我们还演示了链式调用。

在自定义累加器中使用

IntBinaryOperator 可用于实现自定义累积逻辑。此示例创建了一个简单的统计计算器,用于处理数组。

Main.java
package com.zetcode;

import java.util.function.IntBinaryOperator;

public class Main {
    
    public static int processArray(int[] array, int initial, 
            IntBinaryOperator operator) {
        int result = initial;
        for (int value : array) {
            result = operator.applyAsInt(result, value);
        }
        return result;
    }

    public static void main(String[] args) {

        int[] data = {12, 34, 56, 78, 90};
        
        // Calculate sum
        int sum = processArray(data, 0, (a, b) -> a + b);
        System.out.println("Sum: " + sum);
        
        // Calculate product
        int product = processArray(data, 1, (a, b) -> a * b);
        System.out.println("Product: " + product);
        
        // Find minimum
        int min = processArray(data, Integer.MAX_VALUE, 
            (a, b) -> a < b ? a : b);
        System.out.println("Minimum: " + min);
    }
}

此示例演示了在自定义累加器中使用 IntBinaryOperator。processArray 方法将运算符应用于所有元素。我们通过传递不同的运算符,将相同的方法用于不同的操作。

来源

Java IntBinaryOperator 接口文档

在本文中,我们介绍了 Java IntBinaryOperator 接口的基本方法和特性。理解这些概念对于在 Java 应用程序中使用原始类型的函数式编程至关重要。

作者

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

列出所有Java教程