Ottieni gli ID di entità da due raccolte simili usando un metodo

0

Ho due liste:

List<Integer, ZooEntity> zoos;
List<Integer, List<ZooEntity>> groupOfZoos;

Queste operazioni restituiranno raccolte di valori:

Collection<ZooEntity> cz = zoos.values();
Collection<List<ZooEntity>> czList = groupOfZoos.values();

Quello che voglio ottenere è ottenere l'elenco di tutti gli ID dello zoo.

List<Integer> zooIds = cz ids + czList ids;

Naturalmente posso creare due metodi per fare ciò che voglio:

public List<Integer> getIdsFromFlatList(Collection<ZooEntity> list) {
    List<Integer> ids = new ArrayList<Integer>();
    for (ZooEntity z : list) {
        ids.add(z.getId());
    }
    return ids;
}

public List<Integer> getIdsFromNestedList(Collection<List<ZooEntity>> list) {
    List<Integer> ids = new ArrayList<Integer>();
    for (List<ZooEntity> zList : list) {
        for (ZooEntity z : zList) {
            ids.add(z.getId());
        }
    }
    return ids;
}

Come puoi vedere questi due metodi sono molto simili e questa è la mia domanda:

È positivo creare un metodo (ad esempio utilizzando i generici) che otterrà gli ID da questi due elenchi ( zoos e groupOfZoos ). Se sì, come dovrebbe essere? Se no qual è la soluzione migliore?

A proposito. Questo è solo l'esempio. Ho un problema molto simile al lavoro e voglio farlo in modo preety (non posso cambiare l'unità, posso cambiare solo i metodi getIds...() ).

    
posta pepuch 12.11.2013 - 19:38
fonte

1 risposta

1

Le generiche non sono la risposta qui, perché tutti gli oggetti dati sono oggetti ZooEntity . Se avessi classi correlate come Animal , Vegetable e Mineral , avrebbe senso avere un metodo generico che si occupa di "qualcosa che ha un ID", ma non è questo il caso qui.

Ciò che si ha sono cose, raccolte di cose e raccolte nidificate di cose. Non esiste un'interfaccia naturale che è possibile utilizzare o definire per eseguire il lavoro con una sola funzione: le raccolte semplicemente non hanno un metodo getId() . Potresti semplificare il tuo codice usando la ricorsione, ma ciò significherebbe instanceof di controlli ad ogni livello di elaborazione. Finché disponi solo di elenchi lineari e elenchi a nidificazione singola, la via più ovvia è semplicemente quella di chiamare il primo metodo il primo.

    
risposta data 12.11.2013 - 20:00
fonte

Leggi altre domande sui tag