3

考虑一下我有一个 VO 员工,其中包含以下字段。

员工

EmployeeId
EmployeeName
EmployeeDOB
EmployeeAddress

我有一个员工 VO 列表,比如 EmployeeList。
我想在 EmployeeList 中创建另一个所有 EmployeeId 的列表。
我知道最常见的方法是迭代 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()) ;
}

我想知道是否有一种方法可以在没有像上面那样迭代employeeList 的情况下添加所有employeeId。
我不想更改现有的填充方法,因为它发生在 EJB 中并且也被许多其他类使用。

4

5 回答 5

4

试试LambdaJ

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

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

请注意,这些方法调用 (extracton) 是类中的静态方法,Lambda因此您可以对该类进行静态导入,这样代码看起来很漂亮。

于 2013-06-07T09:51:12.787 回答
3

您可以使用以 ID 作为键的Map,这样您将拥有一个集合,并且您可以populate(employeeList)在一次迭代中添加这两个集合。你想要的(添加 id one-liner)听起来像是java8中lambdas的工作。

于 2013-06-07T09:48:09.290 回答
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 此时还没有遍历原始列表,它会将其包装到另一个不同的列表中,并在访问元素时即时执行转换。问题是:您不能在结果列表中执行添加/插入,并且在某些时候,您需要遍历它。

于 2013-06-07T09:50:20.437 回答
0

不管有没有其他的方式,但最终只能通过迭代来完成。

此外,我认为没有任何直接的 API 可以帮助您实现这一目标。

所以,无论你在做什么,都是最好的方式。

还有一件事,您可以在填充员工 VO 时做到这一点。那时,您可以为员工 ID 创建一个地图或单独的列表。

但同样,这只是一个优化。

于 2013-06-07T09:47:16.450 回答
0

AFAIK 没有。

然而有两件事。您可以在填充 VO 的同时填充 id 列表,这将避免您在 VO 列表上进行额外的迭代。

如果您仍然按照此处介绍的方式进行操作,我建议在 id 列表的初始化时提供列表大小,以避免在 ArrayList 中多次重新分配底层数组。

List<String> employeeIdList = new ArrayList<String>(employeeIdList.size());

要优化集合操作,您应该考虑在此集合上执行的操作以选择更合适的实现。(添加/删除操作主要=> LinkedList,随机访问(get(n)) => arrayList, contains => Set, etc...)

于 2013-06-07T09:49:26.957 回答