ZetCode

Java LongFunction 接口

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

java.util.function.LongFunction 接口表示一个接受 long 类型参数并产生结果的函数。它是一个函数式接口,只有一个抽象方法 apply。 LongFunction 专门用于 long 原语类型,以避免装箱开销。

LongFunction 是 Java 8 中添加的 Java 函数式编程实用程序的一部分。它允许使用 long 原语值进行行为参数化。 当处理需要 long 输入的数值运算时,该接口非常有用。

LongFunction 接口概述

LongFunction 接口包含一个抽象方法。关键方法 apply 对 long 输入值执行操作。 与 Function 不同,它不提供组合方法。

@FunctionalInterface
public interface LongFunction<R> {
    R apply(long value);
}

以上代码显示了 LongFunction 接口的结构。它使用泛型,其中 R 是结果类型。该接口使用 @FunctionalInterface 注释,以表明其只有一个抽象方法的特性。

LongFunction 的基本用法

使用 LongFunction 最简单的方法是使用 lambda 表达式。我们在 apply 方法中定义如何将 long 输入转换为输出。 该示例将 long 值转换为它们的字符串表示形式。

Main.java
package com.zetcode;

import java.util.function.LongFunction;

public class Main {

    public static void main(String[] args) {

        // Define a function that takes long and returns String
        LongFunction<String> toStringFunction = l -> "Value: " + l;
        
        // Apply the function
        System.out.println(toStringFunction.apply(100L));
        System.out.println(toStringFunction.apply(9999999999L));
        
        // Function using static method reference
        LongFunction<String> hexFunction = Long::toHexString;
        System.out.println("Hex: " + hexFunction.apply(255L));
    }
}

此示例演示了使用 lambda 和方法引用的 LongFunction 的基本用法。 toStringFunction 接受 long 类型并返回 String。 我们将其应用于不同的 long 值。 方法引用为现有方法提供了简洁的语法。

LongFunction 与数学运算

LongFunction 对于接受 long 值的数学运算很有用。 我们可以执行计算并返回任何类型的结果。 此示例计算平方根并返回格式化的字符串。

Main.java
package com.zetcode;

import java.util.function.LongFunction;

public class Main {

    public static void main(String[] args) {

        // Calculate square root and format as string
        LongFunction<String> sqrtFunction = l -> {
            double result = Math.sqrt(l);
            return String.format("√%d = %.2f", l, result);
        };
        
        System.out.println(sqrtFunction.apply(25L));
        System.out.println(sqrtFunction.apply(10000L));
        System.out.println(sqrtFunction.apply(2L));
    }
}

此示例显示 LongFunction 执行数学运算。 我们计算 long 值的平方根并将结果格式化为字符串。 该函数结合了计算和字符串格式化。

LongFunction 与集合

LongFunction 可以根据 long 输入生成集合。 此示例创建具有重复值的列表。 列表的大小由输入确定。

Main.java
package com.zetcode;

import java.util.function.LongFunction;
import java.util.Collections;
import java.util.List;

public class Main {

    public static void main(String[] args) {

        // Create list with n copies of "Hello"
        LongFunction<List<String>> listCreator = n -> 
            Collections.nCopies((int) n, "Hello");
            
        System.out.println("Size 3: " + listCreator.apply(3L));
        System.out.println("Size 5: " + listCreator.apply(5L));
        
        // Note: casting long to int may lose precision for very large values
    }
}

此示例演示了 LongFunction 创建集合。 我们生成包含字符串多个副本的列表。 大小由 long 输入控制。 将其转换为 int 时要小心大值。

LongFunction 与 Streams

LongFunction 非常适合与 Java Streams 配合使用来处理数值数据。 此示例在流管道中使用它来转换 long 值。 我们将数字转换为它们的二进制表示形式。

Main.java
package com.zetcode;

import java.util.function.LongFunction;
import java.util.stream.LongStream;

public class Main {

    public static void main(String[] args) {

        // Function to convert long to binary string
        LongFunction<String> toBinary = l -> Long.toBinaryString(l);
        
        // Process stream of long values
        LongStream.range(1, 6)
            .mapToObj(toBinary)
            .forEach(s -> System.out.println("Binary: " + s));
    }
}

此示例显示了流管道中的 LongFunction。 我们将一系列 long 值转换为它们的二进制字符串表示形式。 mapToObj 方法接受我们的 LongFunction 来执行转换。

LongFunction 与异常处理

LongFunction 实现可能需要处理异常。 此示例显示了如何在处理 long 值时处理潜在的异常。 我们在处理之前验证输入。

Main.java
package com.zetcode;

import java.util.function.LongFunction;

public class Main {

    public static void main(String[] args) {

        // Function with input validation
        LongFunction<String> safeConverter = l -> {
            if (l < 0) {
                return "Error: Negative value";
            }
            return "Processed: " + (l * 2);
        };
        
        System.out.println(safeConverter.apply(10L));
        System.out.println(safeConverter.apply(-5L));
        System.out.println(safeConverter.apply(0L));
    }
}

此示例演示了 LongFunction 中的异常处理。 我们在处理之前验证输入的 long 值。 对于负数,我们返回一条错误消息而不是处理。 这可以防止潜在的问题。

LongFunction 与自定义对象

LongFunction 可以根据 long 输入返回自定义对象。 此示例从 long 值创建简单的 Point 对象。 x 和 y 坐标是从输入派生的。

Main.java
package com.zetcode;

import java.util.function.LongFunction;

class Point {
    private final long x;
    private final long y;
    
    public Point(long x, long y) {
        this.x = x;
        this.y = y;
    }
    
    @Override
    public String toString() {
        return String.format("Point(%d, %d)", x, y);
    }
}

public class Main {

    public static void main(String[] args) {

        // Create Point from long value
        LongFunction<Point> pointCreator = l -> new Point(l, l * 2);
        
        System.out.println(pointCreator.apply(5L));
        System.out.println(pointCreator.apply(10L));
    }
}

此示例显示 LongFunction 创建自定义 Point 对象。 该函数接受一个 long 值,并返回一个具有基于该值的坐标的 Point。 这演示了 LongFunction 如何生成复杂的返回类型。

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

LongFunction 可以与其他函数式接口结合使用以进行更复杂的操作。 此示例显示了如何将其与 Predicate 结合使用以进行过滤。 我们仅处理偶数。

Main.java
package com.zetcode;

import java.util.function.LongFunction;
import java.util.function.LongPredicate;

public class Main {

    public static void main(String[] args) {

        // Predicate to check if even
        LongPredicate isEven = l -> l % 2 == 0;
        
        // Function to process even numbers
        LongFunction<String> evenProcessor = l -> 
            isEven.test(l) ? "Even: " + l : "Odd: " + l;
            
        System.out.println(evenProcessor.apply(4L));
        System.out.println(evenProcessor.apply(7L));
    }
}

此示例将 LongFunction 与 LongPredicate 结合使用。 我们首先使用谓词检查输入是否为偶数。 然后,该函数根据检查结果以不同的方式处理该值。 这展示了函数组合。

来源

Java LongFunction 接口文档

在本文中,我们介绍了 Java LongFunction 接口的基本方法和功能。 了解这些概念对于在 Java 应用程序中使用原语 long 值进行函数式编程至关重要。

作者

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

列出所有Java教程