【问题标题】:How to write java class methods that can accept groovy closures如何编写可以接受 groovy 闭包的 java 类方法
【发布时间】:2012-10-28 13:21:52
【问题描述】:

这是我想做的:

我有一个名为RowCollection 的类,它包含一个Row 对象的集合,以及一个名为edit 的方法,它应该接受另一个在Row 上运行的方法(或闭包)作为参数对象。

Groovy 脚本将通过以下方式使用此类的对象:

rc.edit({ it.setTitle('hello world') }); // it is a "Row" object

我的问题:

  1. RowCollection#edit 的签名是什么样的?
  2. 它的实现是什么样的?

【问题讨论】:

    标签: java groovy


    【解决方案1】:

    作为替代方案,如果您让 RowCollection 实现 Iterable<Row> 并提供合适的 iterator() 方法,那么适用于所有类的标准 Groovy-JDK 魔法将启用

    rc.each { it.title = "hello world" }
    

    您可以以同样的方式免费获得所有其他 iterator 支持的 GDK 方法,包括 collectfindAllinjectanyeverygrep

    【讨论】:

      【解决方案2】:

      好的 - 稍微挖掘一下,这里是:

      class RowCollection {
          private List<Row> rows;
      
          // ...
      
          public void edit(Closure c) {
              for(Row r : rows) {
                  c.call(r);
              }
          }
      
          // ...
      }
      

      类 Closure 在 groovy.lang 包中。

      【讨论】:

      • c.call 不是c.calls,确定吗?
      • 另外,foreach( Row r : rows ) 你的意思可能是for( Row r : rows )
      • 没错 - 进行了编辑。随意对错别字进行编辑:)
      猜你喜欢
      • 2016-06-01
      • 1970-01-01
      • 2020-04-18
      • 2014-02-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-17
      • 1970-01-01
      相关资源
      最近更新 更多