返回方法参考

时间:2016-05-28 13:34:51

标签: java-8 method-reference

我正在使用Java 8.如何返回方法引用?

我能够返回lambda而不是方法引用。

我的尝试:

public Supplier<?> forEachChild(){
     return new ArrayList<?>::forEach;
}

OR

public Function<?> forEachChild(){
     return new ArrayList<?>::forEach;
}

2 个答案:

答案 0 :(得分:6)

您对method-references的工作原理有一些误解。

首先,您不能new方法参考。

然后,让我们通过你想做的事情来推理。您希望方法forEachChild能够返回接受ListConsumer的内容。 List将在哪个对象上调用forEach,而Consumer将是对列表的每个元素执行的操作。为此,您可以使用BiConsumer:这表示采用2个参数并且不返回任何结果的操作:第一个参数是列表,第二个参数是消费者。

因此,以下内容将起作用:

public <T> BiConsumer<List<T>, Consumer<? super T>> forEachChild() {
    return List::forEach;
}

这种类型的方法引用称为“引用特定类型的任意对象的实例方法”。会发生的是List<T>类型的第一个参数成为forEach将被调用的对象,方法是将其作为参数Consumer

然后你就可以使用它:

forEachChild().accept(Arrays.asList("1", "2"), System.out::println);

答案 1 :(得分:1)

我想补充一点。

您无法实例化无界类型实例。

List<?> list = new ArrayList<?>();

其次,正如Tunaki所提到的,当您进行方法参考时,您无法引用new MyObject::staticMethod

另一方面,forEach(Consumer<T> consumer) (管道流的终端操作)不会返回任何内容。它只吃我们喂它的任何东西。

- 希望这可能会有所帮助:)