我在java中探索方法引用,并且好奇是否可以将以下内容转换为方法引用
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8);
list.forEach(item -> new SomeClass(item).someMethod(item));
我尝试了以下内容,但这不起作用
list.forEach(SomeClass::new::someMethod);
答案 0 :(得分:3)
有四种类型的方法参考,你可以根据java规范使用,你只能使用这种类型的方法参考
引用特定类型的任意对象的实例方法 lass :: instanceMethodName
引用特定对象的实例方法 object :: instanceMethodName
答案 1 :(得分:3)
无法以您提供的方式解决问题。但可以通过将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
s,也不会被使用。
答案 2 :(得分:2)
这可能是一个选项吗?
Function<Integer, SomeClass> f = SomeClass::new;
List<Integer> 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);
答案 3 :(得分:0)
我想到了以下代码。虽然,它没有使用方法参考,但应该比命令式样式编码更具可读性。
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8);
Function<Integer, SomeClass> someClass = SomeClass::new;
BiConsumer<SomeClass, Integer> someMethod = SomeClass::someMethod;
list.forEach(item -> someMethod.accept(someClass.apply(item), item));