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 接受 ListConsumer 的东西。 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 任何东西。我们喂它什么它就吃什么。

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