2012-11-17 11 views
11
Map<String,Object> map = Maps.newHashMap(); 
map.put("test","123"); 
map.put("fuyou001","456"); 
map.put("id",145); 
List<Map<String,Object>> list = Lists.newArrayList(); 
list.add(map); 
Lists.transform(list, new Function<Map<String, Object>, Object>() { 
    @Override 
    public Object apply(@Nullable Map<String, Object> input) { 
    System.out.println("test:" + input); 
    return input; 
    } 
}); 
System.out.println(list);` 

Console non è visualizzare "prova ...."Come evitare applicato pigramente Lists.transform in guava?

come evitare applicato pigramente
cerco anche

List<Map<String,Object>> newList = new ArrayList<Map<String, Object>>(list.size()); 
Collections.copy(newList,list); 

ma non effettuare

risposta

19

Function s in generale non dovrebbe avere effetti collaterali; questo è il tuo vero problema

Detto questo, se si desidera applicare immediatamente la trasformazione, eseguire una copia: Lists.newArrayList(Lists.transform(list, function)).

+0

se io non uso Lists.newArrayList (Lists.transform (elenco, funzione)), quando sarà licenziato la funzione? – fuyou001

+0

Quando si esegue effettivamente l'iterazione o si esegue una query nell'elenco. –

+0

Grazie mille! – fuyou001

3

Per completare la risposta di Louis, si utilizza Lists.transform() come se fosse stato modificato l'originale list, come Collections.sort(). Non è così.

bisogna usare il valore di ritorno di Lists.transform() vedere accadere qualcosa, tenendo presente che si tratta di un vista che viene valutata ogni volta si chiama. Quindi se hai bisogno di usare il risultato più volte, come ha detto Louis, fai una copia in un nuovo List (ArrayList, ImmutableList, ecc.).

4

L'utilizzo di una lista immutabile costringerà i valori a essere calcolati in modo impaziente e, quindi, non è necessario eseguire una copia aggiuntiva in seguito. Questa è forse una soluzione più elegante:.

list = ImmutableList.copyOf(Lists.transform(list, 
    new Function<Map<String, Object>, Object>() { 
    @Override 
    public Object apply(@Nullable Map<String, Object> input) { 
    System.out.println("test:" + input); 
    return input; 
    } 
})); 
System.out.println(list);`