复杂对象的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
}