ZetCode

Java ToLongBiFunction 接口

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

java.util.function.ToLongBiFunction 接口表示一个接受两个参数并产生一个 long 类型结果的函数。它是一个函数式接口,具有一个抽象方法 applyAsLong

ToLongBiFunction 是 Java 8 中添加的 Java 函数式编程实用程序的一部分。它专门用于原始 long 返回值,以避免装箱开销。该接口通常用于流操作和数据处理。

ToLongBiFunction 接口概述

ToLongBiFunction 接口包含一个抽象方法,该方法接受两个参数并返回一个 long 值。它使用两个泛型类型来参数化输入参数。

@FunctionalInterface
public interface ToLongBiFunction<T, U> {
    long applyAsLong(T t, U u);
}

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

ToLongBiFunction 的基本用法

使用 ToLongBiFunction 的最简单方法是使用 lambda 表达式。我们定义如何处理两个输入以产生一个 long 结果。此示例计算两个整数的乘积。

Main.java
package com.zetcode;

import java.util.function.ToLongBiFunction;

public class Main {

    public static void main(String[] args) {

        // Define a function that multiplies two integers
        ToLongBiFunction<Integer, Integer> multiplier = (a, b) -> a * b;
        
        // Apply the function
        long result1 = multiplier.applyAsLong(5, 7);
        long result2 = multiplier.applyAsLong(10, 20);
        
        System.out.println("5 * 7 = " + result1);
        System.out.println("10 * 20 = " + result2);
    }
}

此示例演示了使用 lambda 表达式的 ToLongBiFunction 的基本用法。 multiplier 函数接受两个 Integer 并返回它们的乘积作为 long 值。 我们将其应用于不同的数字对并打印结果。

字符串长度计算

ToLongBiFunction 可以处理不同的输入类型。此示例计算两个字符串组合的总长度。它展示了如何处理非数值输入。

Main.java
package com.zetcode;

import java.util.function.ToLongBiFunction;

public class Main {

    public static void main(String[] args) {

        // Function to calculate combined length of two strings
        ToLongBiFunction<String, String> lengthSum = 
            (s1, s2) -> s1.length() + s2.length();
        
        System.out.println("Total length: " + 
            lengthSum.applyAsLong("hello", "world"));
        System.out.println("Total length: " + 
            lengthSum.applyAsLong("java", "programming"));
    }
}

此示例展示了 ToLongBiFunction 处理 String 输入。 lengthSum 函数计算两个字符串的组合长度。结果作为原始 long 返回,以避免 Integer 装箱。

日期差异计算

ToLongBiFunction 对于时间计算很有用。此示例计算两个 LocalDate 对象之间的天数。它演示了如何处理复杂的输入类型。

Main.java
package com.zetcode;

import java.time.LocalDate;
import java.time.temporal.ChronoUnit;
import java.util.function.ToLongBiFunction;

public class Main {

    public static void main(String[] args) {

        // Function to calculate days between two dates
        ToLongBiFunction<LocalDate, LocalDate> daysBetween = 
            (d1, d2) -> ChronoUnit.DAYS.between(d1, d2);
        
        LocalDate date1 = LocalDate.of(2023, 1, 1);
        LocalDate date2 = LocalDate.of(2023, 12, 31);
        
        System.out.println("Days between: " + 
            daysBetween.applyAsLong(date1, date2));
    }
}

此示例演示了使用 ToLongBiFunction 的日期计算。 daysBetween 函数使用 Java 的 ChronoUnit 计算日期之间的天数。结果是一个原始 long 值,表示时间差。

使用集合

ToLongBiFunction 可以处理集合元素。此示例计算两个集合中的总元素。它展示了与 Java 集合框架的集成。

Main.java
package com.zetcode;

import java.util.Arrays;
import java.util.Collection;
import java.util.function.ToLongBiFunction;

public class Main {

    public static void main(String[] args) {

        // Function to sum sizes of two collections
        ToLongBiFunction<Collection<?>, Collection<?>> totalElements = 
            (c1, c2) -> c1.size() + c2.size();
        
        Collection<String> list1 = Arrays.asList("a", "b", "c");
        Collection<Integer> list2 = Arrays.asList(1, 2, 3, 4);
        
        System.out.println("Total elements: " + 
            totalElements.applyAsLong(list1, list2));
    }
}

此示例展示了 ToLongBiFunction 处理泛型集合。 totalElements 函数计算两个集合的组合大小。通配符类型参数使其可以与任何集合类型一起使用。

原始类型特化

ToLongBiFunction 具有原始类型特化,以获得更好的性能。此示例演示了使用原始坐标计算 2D 点之间的距离。

Main.java
package com.zetcode;

import java.util.function.ToLongBiFunction;

public class Main {

    public static void main(String[] args) {

        // Function to calculate squared distance between points
        ToLongBiFunction<Double, Double> distanceSquared = 
            (x, y) -> (long) (x * x + y * y);
        
        double x = 3.0;
        double y = 4.0;
        
        System.out.println("Squared distance: " + 
            distanceSquared.applyAsLong(x, y));
    }
}

此示例展示了 ToLongBiFunction 处理原始 double 输入。 distanceSquared 函数计算 x² + y² 作为 long 值。 使用原始类型避免了装箱开销,从而获得更好的性能。

与其他函数式接口组合

ToLongBiFunction 可以与其他函数式接口组合。此示例展示了在应用函数之前进行过滤。它演示了函数式组合。

Main.java
package com.zetcode;

import java.util.function.BiPredicate;
import java.util.function.ToLongBiFunction;

public class Main {

    public static void main(String[] args) {

        // Predicate to check if both numbers are positive
        BiPredicate<Integer, Integer> bothPositive = 
            (a, b) -> a > 0 && b > 0;
        
        // Function to multiply only positive numbers
        ToLongBiFunction<Integer, Integer> safeMultiply = 
            (a, b) -> bothPositive.test(a, b) ? a * b : 0L;
        
        System.out.println("Result: " + safeMultiply.applyAsLong(5, 4));
        System.out.println("Result: " + safeMultiply.applyAsLong(-2, 10));
    }
}

此示例将 ToLongBiFunction 与 BiPredicate 结合使用。 safeMultiply 函数仅在两个输入都为正数时才执行乘法。 否则,它返回 0。 这展示了函数式编程中的条件逻辑。

与流一起使用

ToLongBiFunction 很好地适用于 Java Streams。此示例处理来自并行流的数字对。它演示了函数式编程模式。

Main.java
package com.zetcode;

import java.util.stream.IntStream;
import java.util.function.ToLongBiFunction;

public class Main {

    public static void main(String[] args) {

        // Function to calculate a^2 + b^2
        ToLongBiFunction<Integer, Integer> sumOfSquares = 
            (a, b) -> a*a + b*b;
        
        IntStream.range(1, 5)
            .forEach(i -> {
                long result = sumOfSquares.applyAsLong(i, i+1);
                System.out.println(i + "² + " + (i+1) + "² = " + result);
            });
    }
}

此示例在流管道中展示了 ToLongBiFunction。 sumOfSquares 函数计算连续数字对的 a² + b²。 流生成输入值并打印结果。

来源

Java ToLongBiFunction 接口文档

在本文中,我们介绍了 Java ToLongBiFunction 接口的基本方法和特性。了解这些概念对于在 Java 应用程序中使用原始 long 结果进行高效的函数式编程至关重要。

作者

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

列出所有Java教程