java中的方法参考
我正在探索java中的方法引用,并且好奇是否可以将以下内容转换为方法引用
List list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8); list.forEach(item -> new SomeClass(item).someMethod(item));
我尝试了以下,但这不起作用
list.forEach(SomeClass::new::someMethod);
有四种类型的方法引用,您可以根据java规范使用,您只能使用此类型方法引用
- 引用静态方法Class :: staticMethodName
- 引用构造函数ClassName :: new
-
引用特定类型lass :: instanceMethodName的任意对象的实例方法
-
引用特定对象对象的实例方法:: instanceMethodName
无法以您提供的方式解决问题。 但是可以通过将someMethod
方法定义为static
来完成:
list.forEach(item -> SomeClass.someMethod(item)); list.forEach(SomeClass::someMethod);
SomeClass::new::someMethod
语句不正确。 严格来说, SomeClass::new
是指一段构造函数代码(如Consumer
),它不会返回一个新实例,而您需要一个对象来创建一个方法引用SomeClassinstance::someMethod
。
编辑:
我真的没有看到这种方法的任何优点:
map(SomeClass::new).forEach(SomeClass::someMethod)
因为它导致创建一些无用的SomeClass
实例,其中的item
也不会被使用。
这可能是一个选择吗?
Function f = SomeClass::new; List list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8); list.forEach(i -> f.apply(i).someMethod());
显然,做一个你想要的方法是另一种方法:
private static void method(int item) { new SomeClass(item).someMethod(); } list.forEach(YourClass::method);
我想到了以下代码。 虽然,它不是使用方法参考,但应该比命令式样式编码更具可读性。
List list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8); Function someClass = SomeClass::new; BiConsumer someMethod = SomeClass::someMethod; list.forEach(item -> someMethod.accept(someClass.apply(item), item));