Java中如何使用方法引用::创建对象并调用对应实例方法
问题原因
你写的(Myclass1::new)::print属于链式方法引用,Java语法不支持这种写法。方法引用::是用来直接将单个方法/构造器转换为对应函数式接口实例的语法糖,不能嵌套拼接使用,所以这段代码会直接编译报错。
另外你的代码还有一个隐含问题:Myclass1是非静态内部类,静态方法doWork无法直接实例化非静态内部类,需要先给Myclass1加static修饰符。
实现方案
你的需求完全可以实现,按照你尽量使用::运算符的要求,推荐拆分两步实现:
- 先用构造器引用
Myclass1::new将流中的int元素转换为Myclass1实例 - 再用实例方法引用调用
print方法
修改后的完整doWork代码如下:
public static void doWork(int[] nums) { Arrays.stream(nums) // 构造器引用:将每个int元素传入构造器生成Myclass1实例 .mapToObj(Myclass1::new) // 实例方法引用:调用每个Myclass1实例的print方法 .forEach(Myclass1::print); }
同时修改Myclass1的修饰符:
// 加static修饰,支持静态方法中直接实例化 public static class Myclass1 implements MyInterf1 { // 原有内部逻辑保持不变 }
如果你不想拆分写流操作,也可以用lambda包装构造+调用的逻辑,仅构造环节使用方法引用:
Arrays.stream(nums).forEach(i -> new Myclass1(i).print());
补充说明
Java目前没有提供直接通过链式::一次性完成「对象创建+实例方法调用」的语法,这类场景要么拆分流操作分别使用方法引用,要么用lambda做外层包装。
内容的提问来源于stack exchange,提问作者CuriousMind
相关产品推荐
相关产品推荐

