从对象列表中创建列表

时间:2013-06-07 09:42:19

标签: java list

考虑我有一个带有以下字段的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中发生,并且也被许多其他类使用。

5 个答案:

答案 0 :(得分:4)

尝试LambdaJ

List<String> employeeIds = extract(employeeList,on(Employee.class).getEmployeeId());

我已经使用该项目一段时间了,虽然它有一点学习曲线,但我真的很感激。

请注意,那些方法调用(extracton)是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;设置等...)