Groovy закрытие для сложного объекта - PullRequest
0 голосов
/ 19 сентября 2011

Как я могу написать замыкание для более сложного сценария

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);

Как я могу написать замыкание, чтобы при использовании объекта emplyee я получал подробные данные empData?любая намека на идею?

1 Ответ

2 голосов
/ 19 сентября 2011

Я не уверен, что вы имеете в виду ...

Чтобы перебрать EmployeeData, вы можете просто использовать each:

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
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
}

Используются take() и drop(), поэтому вам понадобится Groovy 1.8.1 +

Надеюсь, это имеет смысл!Однако это немного странный синтаксис (используется ключевое слово add для добавления строк в качестве Employee), и вместо этого может быть лучше придумать что-то похожее на MarkupBuilder, реализовав BuilderSupport

...