Reflection 反映实例方法的惯用Groovy方式是什么?

Reflection 反映实例方法的惯用Groovy方式是什么?,reflection,groovy,Reflection,Groovy,下面是一些问题的示例代码 class Foo { String a() String b() } Bar的初始版本 class Bar { List<Foo> foos = new ArrayList<Foo>() String getAs() { def builder = new StringBuilder() foos.each { builder.append it.a() builder.ap

下面是一些问题的示例代码

class Foo {
  String a()
  String b()
}
Bar的初始版本

class Bar {
  List<Foo> foos = new ArrayList<Foo>()

  String getAs() {
    def builder = new StringBuilder()

    foos.each {
        builder.append it.a()
        builder.append System.getProperty("line.separator")
    }

    builder.toString()
  }

  String getBs() {
    def builder = new StringBuilder()

    foos.each {
        builder.append it.b()
        builder.append System.getProperty("line.separator")
    }

    builder.toString()
  }
}
类栏{
List foos=new ArrayList()
字符串getAs(){
def builder=新的StringBuilder()
每人{
builder.append.a()
builder.append System.getProperty(“line.separator”)
}
builder.toString()
}
字符串getBs(){
def builder=新的StringBuilder()
每人{
builder.append.b()
builder.append System.getProperty(“line.separator”)
}
builder.toString()
}
}
很明显,我想重构这个。我目前有:

class Bar {
  List<Foo> foos = new ArrayList<Foo>()

  String getAs() {
    collectSections "a"
  }

  String getBs() {
    collectSections "b"
  }

  private String collectSections(String method) {
    def builder = new StringBuilder()

    foos.each {
        builder.append it."${method}"()
        builder.append System.getProperty("line.separator")
    }

    builder.toString()
  }
}
类栏{
List foos=new ArrayList()
字符串getAs(){
“a”部分
}
字符串getBs(){
“b”部分
}
私有字符串(字符串方法){
def builder=新的StringBuilder()
每人{
builder.append它。“${method}”()
builder.append System.getProperty(“line.separator”)
}
builder.toString()
}
}

这是groovy最好的方法吗?

我会这样做,因为它抽象了收集算法并使用标准的groovy收集操作方法

class Bar {
  List<Foo> foos = new ArrayList<Foo>()

  String collect(values) {
    values.inject(new StringBuilder()) { b, val ->
        b << val + System.getProperty("line.separator")
    }.toString()
  }

  String getAs() {
    collect foos*.a()
  }

  String getBs() {
    collect foos*.b()
  }
}
类栏{
List foos=new ArrayList()
字符串收集(值){
values.inject(新的StringBuilder()){b,val->

b我们可以完全取消collect,只需执行foos*.a().join(System.getProperty(“line.separator”))即可,但请记住,join不会包含最后一个分隔符。如果您同意,那么是的,它甚至更好。