【问题标题】:"Good" method to call method on each object using Stream API使用 Stream API 在每个对象上调用方法的“好”方法
【发布时间】:2014-12-17 20:53:31
【问题描述】:

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

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

会是这样的:

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

但这不起作用...

是否存在方法引用的可能性,或者x -> x.method() 是这里工作的唯一方法?

【问题讨论】:

    标签: java lambda java-8 java-stream


    【解决方案1】:

    您不需要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
    

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

    【讨论】:

    • 谢谢!错过了“第三种”;)
    • @Jofkos:就我在“现实生活中的代码”中所见,第三种是最重要的。有很多已经存在的方法具有正确的签名 mapfilterforEach...
    【解决方案2】:

    我想应该是:

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

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 2018-03-28
        • 1970-01-01
        • 1970-01-01
        • 2013-02-21
        • 2014-04-12
        • 1970-01-01
        • 2010-11-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多