Return 方法参考
Return method reference
我在玩Java 8.如何return方法参考?
我可以 return lambda 但不能引用方法。
我的尝试:
public Supplier<?> forEachChild(){
return new ArrayList<?>::forEach;
}
或
public Function<?> forEachChild(){
return new ArrayList<?>::forEach;
}
您对 method-references 的工作原理有一点误解。
首先,你不能new
方法参考。
那么,让我们来推理一下你想做什么。您希望方法 forEachChild
能够 return 接受 List
和 Consumer
的东西。 List
将是在哪个对象上调用 forEach
,而 Consumer
将是对列表的每个元素执行的操作。为此,您可以使用 BiConsumer
:这表示一个操作采用 2 个参数并且 return 没有结果:第一个参数是一个列表,第二个参数是一个消费者。
因此,以下将起作用:
public <T> BiConsumer<List<T>, Consumer<? super T>> forEachChild() {
return List::forEach;
}
这种类型的方法引用称为 "Reference to an instance method of an arbitrary object of a particular type"。发生的情况是类型 List<T>
的第一个参数成为将调用 forEach
的对象,方法是将其作为参数 Consumer
.
然后你可以像这样使用它:
forEachChild().accept(Arrays.asList("1", "2"), System.out::println);
我想补充几点。
您不能实例化无界类型实例。
List<?> list = new ArrayList<?>();
其次,正如 Tunaki 提到的,当您引用方法时,您不能引用 new MyObject::staticMethod
另一件事是,forEach(Consumer<T> consumer)
(管道流的终端操作) 没有 return 任何东西。我们喂它什么它就吃什么。
-希望这可能有所帮助:)
我在玩Java 8.如何return方法参考?
我可以 return lambda 但不能引用方法。
我的尝试:
public Supplier<?> forEachChild(){
return new ArrayList<?>::forEach;
}
或
public Function<?> forEachChild(){
return new ArrayList<?>::forEach;
}
您对 method-references 的工作原理有一点误解。
首先,你不能new
方法参考。
那么,让我们来推理一下你想做什么。您希望方法 forEachChild
能够 return 接受 List
和 Consumer
的东西。 List
将是在哪个对象上调用 forEach
,而 Consumer
将是对列表的每个元素执行的操作。为此,您可以使用 BiConsumer
:这表示一个操作采用 2 个参数并且 return 没有结果:第一个参数是一个列表,第二个参数是一个消费者。
因此,以下将起作用:
public <T> BiConsumer<List<T>, Consumer<? super T>> forEachChild() {
return List::forEach;
}
这种类型的方法引用称为 "Reference to an instance method of an arbitrary object of a particular type"。发生的情况是类型 List<T>
的第一个参数成为将调用 forEach
的对象,方法是将其作为参数 Consumer
.
然后你可以像这样使用它:
forEachChild().accept(Arrays.asList("1", "2"), System.out::println);
我想补充几点。
您不能实例化无界类型实例。
List<?> list = new ArrayList<?>();
其次,正如 Tunaki 提到的,当您引用方法时,您不能引用 new MyObject::staticMethod
另一件事是,forEach(Consumer<T> consumer)
(管道流的终端操作) 没有 return 任何东西。我们喂它什么它就吃什么。
-希望这可能有所帮助:)