考虑我有一个带有以下字段的VO员工。
员工
EmployeeId
EmployeeName
EmployeeDOB
EmployeeAddress
我有一份员工VO列表,比如EmployeeList
我想在EmployeeList中创建所有EmployeeIds的另一个列表
我知道最常见的方法是迭代EmployeeList并逐个添加到EmployeeIdList,但有没有办法单手执行?
这是当前代码。
List<Employee> employeeList = new ArrayList<Employee>();
populate(employeeList); //this will add EmployeeVOs to the list
List<String> employeeIdList = new ArrayList<String>();
for(Employee emp:employeeList)
{
employeeIdList.add(emp.getEmployeeId()) ;
}
我想知道是否有一种方法可以添加所有employeeIds而不需要像上面那样迭代employeeList。
我不想更改现有的populate方法,因为它在EJB中发生,并且也被许多其他类使用。
答案 0 :(得分:4)
尝试LambdaJ:
List<String> employeeIds = extract(employeeList,on(Employee.class).getEmployeeId());
我已经使用该项目一段时间了,虽然它有一点学习曲线,但我真的很感激。
请注意,那些方法调用(extract
和on
)是Lambda
类中的静态方法,因此您需要对该类进行静态导入,以便代码看起来很漂亮。 / p>
答案 1 :(得分:3)
您可以使用ID为密钥的Map,这样您就可以拥有一个集合,并且可以在一次迭代中添加populate(employeeList)
。你想要的(添加id one-liner)听起来像是java8中lambdas的工作。
答案 2 :(得分:2)
好吧,有一种方法可以将<{>> 原始List<Employee>
转换为List<String>
而无需迭代。我的方法通常是使用Guava Collections框架:
List<Employee> employeeList = new ArrayList<Employee>();
populate(employeeList);
List<String> employeeIdList = Lists.transform(employeeList, new Function<Employee, String>() {
public String apply(Employee input) {
Preconditions.checkNotNull(input);
return input.getEmployeeId();
}
});
当时Guava没有遍历原始列表,它将其包装到另一个不同的列表中,并在访问元素时执行转换动态。问题是:你不能在结果列表中执行添加/插入,并且在某些时候,你需要迭代它。
答案 3 :(得分:0)
无论是否有其他方式,但最终只能通过迭代完成。
此外,我认为没有任何直接API可以帮助您实现这一目标。
所以,无论你做什么都是最好的方法。
还有一件事,你可以在填充员工VO的同时做到这一点。那时,您可以为员工ID创建地图或单独的列表。
但同样,这只是一次优化。
答案 4 :(得分:0)
AFAIK没有。
然而,有两件事。您可以在填充VO列表的同时填充id列表,这样可以避免在VO列表上进行额外的迭代。如果你继续在这里介绍的方式,我建议在初始化id列表时提供列表大小,以避免在ArrayList中多次重新分配底层数组。
List<String> employeeIdList = new ArrayList<String>(employeeIdList.size());
要优化集合操作,您应该考虑对此集合执行的操作,以选择更合适的实现。 (添加/删除操作主要是=&gt; LinkedList,随机访问(get(n))=&gt; arrayList,包含=&gt;设置等...)