java中的方法参考

时间:2017-06-23 11:23:30

标签: java java-8 method-reference

我在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);

4 个答案:

答案 0 :(得分:3)

有四种类型的方法参考,你可以根据java规范使用,你只能使用这种类型的方法参考

  1. 引用静态方法 Class :: staticMethodName
  2. 对构造函数 ClassName :: new
  3. 的引用
  4. 引用特定类型的任意对象的实例方法 lass :: instanceMethodName

  5. 引用特定对象的实例方法 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::someMet‌hod)

因为它会导致创建一部分无用的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));