Java中能否构造方法/Lambda表达式数组?支持带参数调用吗?
Java中实现方法/Lambda数组并支持运行时调用的方案
Java完全支持你想要的操作,不过和C/C++的typedef方式不同,Java是通过函数式接口来定义统一的方法签名,以此实现方法引用或Lambda表达式的数组存储与运行时调用。
一、无参数无返回值的场景
可以使用Java内置的Runnable接口,或者自定义函数式接口:
自定义函数式接口示例
// 定义无参无返回的函数式接口 @FunctionalInterface interface VoidAction { void execute(); } // 普通成员方法 void method1() { System.out.println("执行方法1"); } void method2() { System.out.println("执行方法2"); } // 初始化方法引用数组和Lambda数组 public void initArrays() { VoidAction[] methods = {this::method1, this::method2}; VoidAction[] lambdas = { () -> System.out.println("执行Lambda1"), () -> System.out.println("执行Lambda2") }; // 运行时通过索引调用 methods[0].execute(); // 输出:执行方法1 lambdas[1].execute(); // 输出:执行Lambda2 }
使用内置Runnable接口示例
Runnable[] runnables = { this::method1, () -> System.out.println("Lambda执行") }; runnables[1].run(); // 调用Lambda
二、带参数的场景
根据参数和返回值的不同,可以选择Java内置的函数式接口(如Consumer、Function、BiFunction等),或者自定义匹配签名的接口。
单参数无返回值(使用Consumer)
// 带String参数的方法 void printUpper(String text) { System.out.println(text.toUpperCase()); } void printLower(String text) { System.out.println(text.toLowerCase()); } // 初始化数组 Consumer<String>[] paramMethods = (Consumer<String>[]) new Consumer[] { this::printUpper, this::printLower, s -> System.out.println("字符串长度:" + s.length()) }; // 调用 paramMethods[0].accept("hello"); // 输出:HELLO paramMethods[2].accept("world"); // 输出:字符串长度:5
多参数带返回值(自定义接口)
// 定义接收两个int参数、返回int的函数式接口 @FunctionalInterface interface BinaryCalculator { int calculate(int a, int b); } // 普通方法 int add(int x, int y) { return x + y; } // 初始化数组 BinaryCalculator[] calculators = { this::add, (x, y) -> x - y, (x, y) -> x * y }; // 调用并获取结果 int result = calculators[2].calculate(3, 4); // result = 12
关键说明
- 函数式接口只需包含一个抽象方法(
@FunctionalInterface注解是可选的,但能强制编译器检查接口是否符合要求)。 - 只要方法引用或Lambda的参数、返回值类型与函数式接口的抽象方法完全匹配,就能被放入对应类型的数组中。
- 运行时通过数组索引调用元素的抽象方法,就和调用普通方法一样自然。
内容的提问来源于stack exchange,提问作者lostbits
相关产品推荐
相关产品推荐

