2015-02-25 4 views
3

Это классы моего проекта. Класс Bean - это супер тип Employe и Computer, и он неинтересен.Как сделать это более общим для цикла с дженериками?

Как сделать его более общим для цикла с дженериками?

Я бы написал два цикла ниже один раз, используя generics в утилите метода riusable.

//Loop 1 

List<Map<String, Object>> employeRows = //from query on database 

List<Employe> employList = new ArrayList<Employe>(); 

for (Map<String, Object> row : employeRows) { 
    Employe e = new Employe(row); 
    employList .add(e); 
} 

//Loop 2 

List<Map<String, Object>> computerRows = //from query on database 

List<Computer> computerList = new ArrayList<Computer>(); 

for (Map<String, Object> row : computerRows) { 
    Computer c = new Computer(row); 
    computerList.add(c); 
} 

Этот псевдо-код является примером того, что я хочу добиться:

List<Employe> = Utility.toList(employeRows, ...); 
List<Computer> = Utility.toList(computerList, ...); 
+2

Можете ли вы быть немного более ясно? Что вы подразумеваете, сделав его более общим? –

+0

Какую версию Java вы используете? –

ответ

1

Используйте Factory Pattern, одна абстрактная фабрика

interface ObjectCreater<T> { 
    T create(Map<String, Object> row); 
} 

и двух реализациях, например, для Работника

class EmployeeCreater implements ObjectCreator<T> { 
    T create(Map<String, Object> row) { 
    return new Employee(row); // or the constructor logic inlined 
    } 
} 

определить метод (= Utility.toList()):

List<T> toList(List<Map<String, Object>> row, ObjectCreator<T> creator) { 
    // the upper loop using the factory instead of the Constructor 
} 
4

Если вы используете Java 7 или ниже, завод шаблон является путь. Но если вы уже на Java 8, вы можете добиться этого с помощью потоков и ссылок на лямбда/метод.

Вот как вы делаете это с Java 8:

public static <T> List<T> toList(List<Map<String, Object>> rows, Function<Map<String, Object>, T> mapper) { 
    return rows.stream().map(mapper).collect(Collectors.toList()); 
} 

И затем вызвать этот метод, передав конструктору в качестве опорного метода:

List<Map<String, Object>> employeRows = new ArrayList<Map<String, Object>>(); 
List<Map<String, Object>> computerRows = new ArrayList<Map<String, Object>>(); 

List<Employe> employList = toList(employeRows, Employe::new); 
List<Computer> computerList = toList(computerRows, Computer::new); 
Смежные вопросы