2012-11-17 9 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 nicht angezeigt werden "test ...."Wie vermieden werden, trägst lazily Lists.transform in Guave?

wie träge
angewendet zu vermeiden ich auch

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

versuchen, aber nicht bewirken

Antwort

19

Function s im Allgemeinen nicht Nebenwirkungen haben; das ist dein wirkliches Problem.

Das heißt, wenn Sie darauf bestehen, die Transformation sofort anwenden, tun Sie eine Kopie: Lists.newArrayList(Lists.transform(list, function)).

+0

Wenn ich nicht Lists.newArrayList (Lists.transform (Liste, Funktion))., Wenn die Funktion ausgelöst wird? – fuyou001

+0

Wenn Sie die Liste tatsächlich durchlaufen oder abfragen. –

+0

Vielen Dank! – fuyou001

3

Um Louis Antwort zu ergänzen, verwenden Sie Lists.transform(), als ob es die ursprüngliche list, wie Collections.sort() geändert. Es tut es nicht.

Sie haben den Rückgabewert von Lists.transform() zu nutzen, um etwas geschehen, um zu sehen, wenn man bedenkt, dass es sich um eine Ansicht ist, die jedes Mal Sie es nennen ausgewertet wird. Also, wenn Sie das Ergebnis mehrmals verwenden müssen, wie Louis sagte, machen Sie eine Kopie in einem neuen List (ArrayList, ImmutableList, etc.).

4

Die Verwendung einer unveränderbaren Liste erzwingt die eifrige Berechnung der Werte und somit keine zusätzliche Kopie. Dies ist vielleicht eine elegantere Lösung:

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);` 
Verwandte Themen