2013-06-07 5 views
3

У меня есть сотрудник VO со следующими полями.Создать список из списка объектов

Сотрудник

EmployeeId 
EmployeeName 
EmployeeDOB 
EmployeeAddress 

У меня есть список Сотрудника ВО, скажем EmployeeList.
Я хочу создать еще один список всех EmployeeIds в EmployeeList.
Я знаю, что самый распространенный способ - перечислить 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 как выше.
Я не хочу менять существующий метод заполнения, так как он происходит в EJB и используется многими другими классами.

+0

Если вы добавите каждый 'employeeId' в отдельный' List' в '' метод populate() ', то вам не нужно перебирать через бис' List'. – NINCOMPOOP

+0

Java 8 (Lambda) имеет только положения для таких тривиальных задач. Адаптер списка (Guava), реализующий List , поддерживаемый исходным списком, ничего не спасет и не разрешит независимые вставки/удаления. –

+0

Я не хочу менять существующий метод заполнения с момента его появления в EJB и используется многими другими классами. – jijo

ответ

0

Независимо от того, есть ли другие способы или нет, но в конечном итоге это будет сделано только с помощью итерации.

Кроме того, я не думаю, что есть какой-либо прямой API, который может помочь вам в достижении этого.

Итак, что бы вы ни делали, это лучший способ сделать это.

И еще одно, вы можете это сделать, заполняя Employee VOs. В то время вы можете создать карту или отдельный список для идентификаторов сотрудников.

Но опять же, это будет просто оптимизация.

3

Вы можете использовать Map с идентификатором в качестве ключа, таким образом, у вас будет одна коллекция, и вы можете добавить как в populate(employeeList) на одной итерации. То, что вы хотите (добавление id-liner), похоже на работу для lambdas в java8.

+0

Я не хочу менять существующий метод заполнения, так как это происходит в EJB и используется многими другими классами. Похоже, мне нужно будет продолжить текущий код. Хотел найти что-то более аккуратное. – jijo

+0

Также карта не будет работать, если мне понадобится список имен сотрудников в следующий раз. Так что надеялся на что-то вроде API. – jijo

+0

Затем я рекомендую создавать свою собственную коллекцию, я не знаю никаких библиотек, которые предоставляют все, что вы ищете. – arynaq

0

AFAIK там нет.

2 вещи однако. Вы можете заполнить список идентификаторов одновременно с заполнением VO, это позволит избежать дополнительной итерации в списке VO.

Если вы остаетесь на пути, представленном здесь, я бы посоветовал предоставить размер списка при инициализации списка id, чтобы избежать множественного перераспределения базового массива в ArrayList.

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

Для оптимизации манипуляции с коллекциями вы должны рассмотреть сделанные в этой коллекции операции, чтобы выбрать более подходящую реализацию. (Добавить/удалить операцию в основном => LinkedList, произвольный доступ (получить (п)) => ArrayList, содержит => Set, и т.д ...)

2

Ну, есть способ превратить оригинальный List<Employee> в a 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(); 
    } 
}); 

гуава не перебирать исходный список на тот момент еще, она оборачивает его в другой другой список, и выполняет преобразование на лета когда элементы доступ.Проблема в том, что вы не можете выполнять добавления/вставки в списке результатов, и в какой-то момент вам нужно будет проходить через нее.

+0

+1, хороший подход. – Gab

4

LambdaJ Попробуйте:

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

Я использую проект на некоторое время, и в то время как он имеет немного кривой обучения, я действительно пришел, чтобы оценить его.

Обратите внимание, что эти вызовы методов (extract и on) статические методы в Lambda классе, так что вы хотите сделать статический импорт в этом классе, так что код выглядит.

+0

Я надеялся на что-то, что придет с Java 6. Не стоит добавлять новые банки для такого небольшого комфорта. :) Не забудьте попробовать это для академической цели. – jijo

+0

В Java6 нет однострочного интерфейса, не принося дополнительную библиотеку или не сворачивая самостоятельно. Я также привел его в один из моих проектов в академических целях, но как только я немного поиграл с ним, я обнаружил, что большая часть моего кода манипуляции с коллекцией начала использовать Lambdaj. Это привяжет меня до Java 8. – Rand

Смежные вопросы