ZetCode

Java ToIntBiFunction 接口

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

java.util.function.ToIntBiFunction 接口表示一个接受两个参数并产生一个 int 值结果的函数。它是一个函数式接口,具有一个抽象方法 applyAsInt

ToIntBiFunction 是 Java 8 中添加的 Java 函数式编程实用程序的一部分。它经过专门设计,用于在处理基本 int 类型时避免装箱。该接口对于将两个值组合成一个 int 值的操作非常有用。

ToIntBiFunction 接口概述

ToIntBiFunction 接口包含一个必须实现的抽象方法。该方法接受指定类型的两个参数,并返回一个基本 int 值。

@FunctionalInterface
public interface ToIntBiFunction<T, U> {
    int applyAsInt(T t, U u);
}

上面的代码显示了 ToIntBiFunction 的结构。它使用泛型,其中 T 和 U 是输入类型。该接口使用 @FunctionalInterface 注解,以表明其只有一个抽象方法。

基本 ToIntBiFunction 用法

使用 ToIntBiFunction 的最简单方法是使用 lambda 表达式。我们定义了如何将两个输入组合成一个 int 结果。该示例计算字符串长度差异。

Main.java
package com.zetcode;

import java.util.function.ToIntBiFunction;

public class Main {

    public static void main(String[] args) {

        // Define function to calculate length difference
        ToIntBiFunction<String, String> lengthDiff = 
            (s1, s2) -> s1.length() - s2.length();
        
        // Apply the function
        System.out.println("Difference: " + lengthDiff.applyAsInt("hello", "world"));
        System.out.println("Difference: " + lengthDiff.applyAsInt("longer", "short"));
    }
}

此示例演示了基本的 ToIntBiFunction 用法。lengthDiff 函数接受两个字符串,并返回它们长度的差值作为 int。我们使用 applyAsInt 方法将它应用于不同的字符串对。

计算数字的乘积

ToIntBiFunction 可以在其输入上执行数学运算。此示例显示了两个数字的乘法,演示了基本类型特化。

Main.java
package com.zetcode;

import java.util.function.ToIntBiFunction;

public class Main {

    public static void main(String[] args) {

        // Multiply two integers
        ToIntBiFunction<Integer, Integer> multiplier = 
            (a, b) -> a * b;
        
        System.out.println("Product: " + multiplier.applyAsInt(5, 7));
        System.out.println("Product: " + multiplier.applyAsInt(12, 3));
        
        // Using method reference with parseInt
        ToIntBiFunction<String, String> sumStrings = 
            (s1, s2) -> Integer.parseInt(s1) + Integer.parseInt(s2);
            
        System.out.println("Sum: " + sumStrings.applyAsInt("10", "20"));
    }
}

此示例显示了使用 ToIntBiFunction 的数学运算。multiplier 函数返回两个整数的乘积。sumStrings 函数在将字符串相加之前将字符串解析为整数,展示了类型转换。

使用 ToIntBiFunction 比较对象

ToIntBiFunction 可以实现对象之间的比较逻辑。这对于自定义排序或相等性检查很有用。示例按年龄比较 Person 对象。

Main.java
package com.zetcode;

import java.util.function.ToIntBiFunction;

class Person {
    String name;
    int age;
    
    Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
}

public class Main {

    public static void main(String[] args) {

        // Compare ages of two Person objects
        ToIntBiFunction<Person, Person> ageComparator = 
            (p1, p2) -> p1.age - p2.age;
            
        Person alice = new Person("Alice", 30);
        Person bob = new Person("Bob", 25);
        
        System.out.println("Age difference: " + 
            ageComparator.applyAsInt(alice, bob));
            
        // Using in sorting
        Person[] people = {alice, bob, new Person("Charlie", 20)};
        java.util.Arrays.sort(people, 
            (p1, p2) -> ageComparator.applyAsInt(p1, p2));
            
        System.out.println("Sorted by age: " + 
            java.util.Arrays.toString(people));
    }
}

此示例演示了对象比较。ageComparator 函数返回两个 Person 对象之间的年龄差异。我们直接使用它,并在排序操作中使用它,展示了实际应用。

使用 ToIntBiFunction 的字符串操作

ToIntBiFunction 可以执行各种字符串操作。此示例计算两个字符串之间的公共字符,显示更复杂的逻辑。

Main.java
package com.zetcode;

import java.util.function.ToIntBiFunction;

public class Main {

    public static void main(String[] args) {

        // Count common characters between two strings
        ToIntBiFunction<String, String> commonChars = (s1, s2) -> {
            int count = 0;
            for (char c : s1.toCharArray()) {
                if (s2.indexOf(c) != -1) {
                    count++;
                }
            }
            return count;
        };
        
        System.out.println("Common chars: " + 
            commonChars.applyAsInt("hello", "world"));
        System.out.println("Common chars: " + 
            commonChars.applyAsInt("apple", "pear"));
    }
}

此示例显示了一个更复杂的 ToIntBiFunction 实现。commonChars 函数遍历第一个字符串的字符,并计算第二个字符串中的匹配项。结果是公共字符的计数。

将 ToIntBiFunction 与集合一起使用

ToIntBiFunction 可以处理集合。此示例计算两个列表中相应人员之间的总年龄差异。

Main.java
package com.zetcode;

import java.util.function.ToIntBiFunction;
import java.util.List;

public class Main {

    public static void main(String[] args) {

        List<Integer> list1 = List.of(10, 20, 30);
        List<Integer> list2 = List.of(5, 15, 25);
        
        // Sum of element-wise differences
        ToIntBiFunction<List<Integer>, List<Integer>> sumDiffs = (l1, l2) -> {
            int sum = 0;
            for (int i = 0; i < Math.min(l1.size(), l2.size()); i++) {
                sum += l1.get(i) - l2.get(i);
            }
            return sum;
        };
        
        System.out.println("Total difference: " + 
            sumDiffs.applyAsInt(list1, list2));
            
        // Using with custom objects
        record Point(int x, int y) {}
        
        ToIntBiFunction<Point, Point> distanceSquared = 
            (p1, p2) -> (p1.x - p2.x) * (p1.x - p2.x) + 
                        (p1.y - p2.y) * (p1.y - p2.y);
                        
        System.out.println("Distance squared: " + 
            distanceSquared.applyAsInt(new Point(0, 0), new Point(3, 4)));
    }
}

此示例使用 ToIntBiFunction 处理集合。sumDiffs 函数计算相应列表元素之间的总差值。distanceSquared 函数显示了使用自定义对象的数学计算。

将 ToIntBiFunction 与其他函数式接口结合使用

ToIntBiFunction 可以与其他函数式接口结合使用以进行更复杂的操作。此示例显示了与 Predicate 的组合。

Main.java
package com.zetcode;

import java.util.function.ToIntBiFunction;
import java.util.function.Predicate;

public class Main {

    public static void main(String[] args) {

        // Function to count matches based on predicate
        ToIntBiFunction<List<String>, Predicate<String>> countMatches = 
            (list, predicate) -> {
                int count = 0;
                for (String s : list) {
                    if (predicate.test(s)) {
                        count++;
                    }
                }
                return count;
            };
            
        List<String> words = List.of("apple", "banana", "cherry", "date");
        System.out.println("Count of a's: " + 
            countMatches.applyAsInt(words, s -> s.startsWith("a")));
        System.out.println("Count long words: " + 
            countMatches.applyAsInt(words, s -> s.length() > 5));
    }
}

此示例将 ToIntBiFunction 与 Predicate 结合使用。countMatches 函数接受一个列表和一个谓词,返回满足条件的元素的计数。这展示了函数式接口如何协同工作以提供灵活的解决方案。

真实世界的例子:员工分析

ToIntBiFunction 可以解决现实世界中的业务问题。此示例分析员工数据,根据绩效和任职时间计算奖金点数。

Main.java
package com.zetcode;

import java.util.function.ToIntBiFunction;

record Employee(String name, int performanceScore, int yearsOfService) {}

public class Main {

    public static void main(String[] args) {

        // Calculate bonus points for employees
        ToIntBiFunction<Employee, Integer> bonusCalculator = (emp, basePoints) -> {
            int performanceMultiplier = emp.performanceScore() / 10;
            int tenureBonus = emp.yearsOfService() * 5;
            return basePoints * performanceMultiplier + tenureBonus;
        };
        
        Employee emp1 = new Employee("Alice", 85, 3);
        Employee emp2 = new Employee("Bob", 92, 7);
        
        System.out.println("Alice's bonus: " + 
            bonusCalculator.applyAsInt(emp1, 100));
        System.out.println("Bob's bonus: " + 
            bonusCalculator.applyAsInt(emp2, 100));
            
        // Using with stream
        var employees = List.of(emp1, emp2);
        int totalBonus = employees.stream()
            .mapToInt(emp -> bonusCalculator.applyAsInt(emp, 100))
            .sum();
            
        System.out.println("Total bonus pool: " + totalBonus);
    }
}

此实际示例展示了 ToIntBiFunction 在业务环境中的应用。bonusCalculator 根据多个因素计算员工奖金。我们还演示了使用流来处理员工集合。

来源

Java ToIntBiFunction 接口文档

在本文中,我们介绍了 Java ToIntBiFunction 接口的基本方法和特性。理解这些概念对于使用 Java 中的双参数操作返回基本 int 值的函数式编程至关重要。

作者

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

列出所有Java教程