我正在使用Java 8.如何返回方法引用?
我能够返回lambda而不是方法引用。
我的尝试:
public Supplier<?> forEachChild(){
return new ArrayList<?>::forEach;
}
OR
public Function<?> forEachChild(){
return new ArrayList<?>::forEach;
}
答案 0 :(得分:6)
您对method-references的工作原理有一些误解。
首先,您不能new
方法参考。
然后,让我们通过你想做的事情来推理。您希望方法forEachChild
能够返回接受List
和Consumer
的内容。 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)
(管道流的终端操作)不会返回任何内容。它只吃我们喂它的任何东西。
- 希望这可能会有所帮助:)