使用Stream API在每个对象上调用方法的“好”方法

时间:2014-12-17 20:53:32

标签: java lambda java-8 java-stream

是否可以在消费者中运行方法,如方法引用,但是在传递给使用者的对象上运行:

Arrays.stream(log.getHandlers()).forEach(h -> h.close());

会是这样的:

Arrays.stream(log.getHandlers()).forEach(this::close);

但那不起作用......

是否有可能使用方法引用,或者x -> x.method()是否只能在这里工作?

3 个答案:

答案 0 :(得分:34)

您不需要thisYourClassName::close将在传递给使用者的对象上调用close方法:

Arrays.stream(log.getHandlers()).forEach(YourClassName::close);

有四种方法引用(Source):

Kind                                                                         Example
----                                                                         -------
Reference to a static method                                                 ContainingClass::staticMethodName
Reference to an instance method of a particular object                       containingObject::instanceMethodName
Reference to an instance method of an arbitrary object of a particular type  ContainingType::methodName
Reference to a constructor                                                   ClassName::new

在你的情况下,你需要第三种。

答案 1 :(得分:12)

我想它应该是:

Arrays.stream(log.getHandlers()).forEach(Handler::close);

如果log.getHandlers()返回Handler类型的对象数组。

答案 2 :(得分:7)

当然,但您必须使用method reference的正确语法,即传递close()方法所属的类:

Arrays.stream(log.getHandlers()).forEach(Handler::close);