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
相关产品推荐
相关产品推荐

