复杂对象的groovy闭包

复杂对象的groovy闭包,groovy,closures,Groovy,Closures,如何为下面的复杂场景编写闭包 def empList=[]; EmployeeData empData = null; empData=new EmployeeDataImpl("anish","nath"); empList.add(empData ); empData=new EmployeeDataImpl("JOHN","SMITH"); empList.add(empData ); Employee employee= new Employee(empList); 如何编写闭包,以

如何为下面的复杂场景编写闭包

def empList=[];
EmployeeData empData = null;
empData=new EmployeeDataImpl("anish","nath");
empList.add(empData );
empData=new EmployeeDataImpl("JOHN","SMITH");
empList.add(empData );

Employee employee= new Employee(empList);

如何编写闭包,以便使用Emplye对象获得empData详细信息?有什么好主意吗?

我不知道你的意思

要迭代
员工数据
,只需使用
每个

empList.each { println it }
要查找特定条目,可以使用
find

// Assume EmployeeData has a firstName property, you don't show its structure
EmployeeData anish = empList.find { it.firstName == 'anish' }
或者,您可以使用
findAll
查找所有具有给定姓氏的人:

def smiths = empList.findAll { it.surname == 'Smith' }
这取决于你想要“结束”做什么

编辑 好的,在你解释了你想要的DSL之后,我想到了这个(它将解决给定的问题):

@groovy.transform.Canonical
类雇员数据{
字符串名
字符串姓氏
}
班级员工{
列表雇主=[]
员工(名单){
empList=列表
}
}
阶级雇员{
员工根
列表propchain=[]
EmployeeDSL(员工根目录){
this.root=root
}
def propertyMissing(字符串名称){
//如果名称为“add”,我们有一个名称链
if(name='add'&&propchain){
//添加新员工

root.empList我不知道你在问什么嗨,tim,Q是如何编写闭包来获取数据的?但是什么是
名称
实例
int…选项
应该是什么?我想一个你想要的例子可能会有所帮助?@tim,我已经删除了那个部分,尝试了一个答案…仍然不确定我的思路是否正确…解决方案真的有效我已经发布了你的答案建议并从您的经验中学习groovy,我的第二个问题是如何为同一个程序编写DSL这就是问题所在……您所说的“同一个程序的DSL”是什么意思?您能举一个这样的DSL的例子吗?您试图实现的是什么?另外,与其回答您自己的问题,不如说是b如果把这些额外的信息放到你原来问题的编辑中就更好了。我真的收到了你的问题:-我希望我的dsl看起来像employist=anish.nath.add//实际调用new//EmployeeData(名字:“anish”,姓氏:“nath”),然后添加到列表中;employist=anish.nath.add//实际调用employist.add(新EmployeeData(名字:“Anish”,姓氏:“nath”);)类似于这是我的最终目标。你真的是天才,请与我分享一些有关groovy实用示例和学习的链接,以便我可以在我当前的项目中使用此功能
@groovy.transform.Canonical
class EmployeeData {
  String firstName
  String lastName
}

class Employee {
  List<EmployeeData> empList = []

  Employee( List<EmployeeData> list ) {
    empList = list
  }
}

class EmployeeDSL {
  Employee root

  List propchain = []

  EmployeeDSL( Employee root ) {
    this.root = root
  }

  def propertyMissing( String name ) {
    // if name is 'add' and we have a chain of names
    if( name == 'add' && propchain ) {
      // add a new employee
      root.empList << new EmployeeData( firstName:propchain.take( 1 ).join( ' ' ), lastName:propchain.drop( 1 ).join( ' ' ) )
      // and reset the chain of names
      propchain = []
    }
    else {
      // add this name to the chain of names
      propchain << name
      this
    }
  }
}

Employee emp = new Employee( [] )

new EmployeeDSL( emp ).with {
  anish.nath.add
  tim.yates.add
}

emp.empList.each {
  println it
}