You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java中使用lambda与::操作符调用方法引用的疑问及示例咨询

代码逻辑解释

这段代码不存在递归调用,你看到的Bank::addCustomerTransaction不是方法调用,是Java 8及以上版本提供的「方法引用」语法,本质是把方法本身作为参数传递给customerInput,而不是直接执行这个方法。

核心前提

customerInput方法的第一个参数一定是符合如下特征的函数式接口:

// 自定义的函数式接口,符合参数、返回值要求即可
@FunctionalInterface
public interface CustomerOperation {
    void apply(Bank bank, String branchName, String customerName, double transaction);
}

对应的customerInput方法的定义大概如下,它会自己获取银行实例、支行名、客户名、交易金额这些参数,再调用你传入的CustomerOperation接口的实现:

private static void customerInput(CustomerOperation operation) {
    // 内部逻辑:比如先获取已有的Bank实例,再读取用户输入的各类参数
    Bank bank = getCurrentBankInstance();
    String branchName = readUserInput("请输入支行名:");
    String customerName = readUserInput("请输入客户名:");
    double amount = Double.parseDouble(readUserInput("请输入交易金额:"));
    // 这里才会真正执行你传入的lambda/方法引用对应的逻辑
    operation.apply(bank, branchName, customerName, amount);
}

两种写法的等价性

你给出的两种写法完全等价:

  • 第一种是Lambda表达式写法:相当于手动声明了4个参数,再把参数原样传给Bank实例的对应方法
  • 第二种是方法引用语法糖:Java编译器会自动帮你做参数的匹配传递,不需要你手动写参数声明,代码更简洁。

最小可运行示例

import java.util.Scanner;

// 函数式接口
@FunctionalInterface
interface CustomerOperation {
    void apply(Bank bank, String branchName, String customerName, double transaction);
}

// Bank类定义
class Bank {
    public void addCustomerTransaction(String branchName, String customerName, double transaction) {
        System.out.printf("给支行[%s]的客户[%s]添加交易记录:%.2f元%n", branchName, customerName, transaction);
    }

    public void addCustomer(String branchName, String customerName, double initialAmount) {
        System.out.printf("在支行[%s]新增客户[%s],初始金额:%.2f元%n", branchName, customerName, initialAmount);
    }
}

public class BankTest {
    private static final Scanner scanner = new Scanner(System.in);

    private static Bank getCurrentBankInstance() {
        return new Bank(); // 示例直接返回新实例,实际场景可能是全局唯一的银行实例
    }

    private static String readUserInput(String tip) {
        System.out.print(tip);
        return scanner.nextLine();
    }

    private static void customerInput(CustomerOperation operation) {
        Bank bank = getCurrentBankInstance();
        String branchName = readUserInput("请输入支行名:");
        String customerName = readUserInput("请输入客户名:");
        double amount = Double.parseDouble(readUserInput("请输入金额:"));
        operation.apply(bank, branchName, customerName, amount);
    }

    // 方法引用写法
    private static void addCustomerTransaction() {
        customerInput(Bank::addCustomerTransaction);
    }

    private static void addCustomer() {
        customerInput(Bank::addCustomer);
    }

    public static void main(String[] args) {
        System.out.println("=== 新增客户测试 ===");
        addCustomer();
        System.out.println("\n=== 添加交易测试 ===");
        addCustomerTransaction();
    }
}

运行之后你就能看到,调用addCustomer()或者addCustomerTransaction()的时候,只是把对应的操作逻辑传给了customerInput,由customerInput内部拿到参数之后才真正执行对应的Bank方法,不存在自己调用自己的递归逻辑。

内容的提问来源于stack exchange,提问作者user17188729

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 02:45:04