2015-05-18 10 views
5

Ho una lista in cui ho bisogno di aggiungere un prefisso in tutti gli elementi della mia lista.Come aggiungere un prefisso a tutti gli elementi di List in modo efficiente?

Di seguito è riportato il modo in cui lo sto facendo iterando l'elenco e quindi aggiungendolo. C'è qualche altro modo migliore per farlo? Qualsiasi uno-due di linea che può fare la stessa roba?

private static final List<DataType> DATA_TYPE = getTypes(); 

public static LinkedList<String> getData(TypeFlow flow) { 
    LinkedList<String> paths = new LinkedList<String>(); 
    for (DataType current : DATA_TYPE) { 
     paths.add(flow.value() + current.value()); 
    } 
    return paths; 
} 

ho bisogno di tornare LinkedList da quando sto usando alcuni metodi della classe LinkedList come removeFirst.

Sono su Java 7 al momento.

+0

Usa Java 8 Stream con 'map'. –

+0

Sto usando Java 7 sfortunatamente. – user1950349

risposta

7

Per uno liners, utilizzare Java 8 Streams:

List<String> paths = DATA_TYPE.stream().map(c -> flow.value() + c.value()).collect(Collectors.toList()); 

Se si deve produrre un LinkedList, è necessario utilizzare un collettore diverso.

+0

Sto usando Java 7 sfortunatamente. – user1950349

+2

@ user1950349 In Java 7 l'implementazione sembra il più breve possibile. – Eran

3

L'implementazione sembra ok, ma se volete qualcosa di diverso, provate questo:

public static List<String> getData(final TypeFlow flow) { 
    return new AbstractList<String>() { 
     @Override 
     public String get(int index) { 
      return flow.value()+DATA_TYPE.get(index).value(); 
     } 

     @Override 
     public int size() { 
      return DATA_TYPE.size(); 
     } 
    }; 
} 

In questo modo si crea una "lista virtuale", che in realtà non contiene dati, ma calcola al volo.

+0

Qual è la differenza tra la tua versione e la mia versione qui? Cosa intendi con la lista virtuale qui? – user1950349

+0

Non richiede memoria aggiuntiva tranne una quantità costante come 20-30 byte. E non esegue alcuna concatenazione di stringhe finché non inizi ad attraversare questa lista. La tua versione crea tutte le stringhe prefissate e le archivia in memoria in anticipo, che prende la memoria addizionale O (n) dove n è la dimensione dell'elenco 'DATA_TYPE'. Nel tuo caso probabilmente non è importante, ma se hai milioni di voci in 'DATA_TYPE', il footprint di memoria potrebbe differire in modo significativo. –

+0

Implementazione molto interessante! – marcolopes

Problemi correlati