2013-02-05 4 views
5

wie kann ich alle "name" string Elemente der folgenden Struktur am besten erhalten:Wie extrahiert man alle Elemente einer bestimmten Eigenschaft in einer Liste?

class Foo { 
    List<Bar> bars; 
} 

class Bar { 
    private String name; 
    private int age; 
} 

würde Mein Ansatz:

List<String> names = new ArrayList<String>(); 

for (Bar bar : foo.getBars()) { 
    names.add(bar.getName()); 
} 

Dies könnte funktionieren, aber nicht da ist etwas in Java. Collections wo kann ich einfach so schreiben: Collections.getAll(foo.getBars(), "name");?

+3

für Java warten Nur 8 ;-) –

Antwort

1

mit Java 8:

List<String> names =   
    foo.getBars().stream().map(Bar::getName).collect(Collectors.toList()); 
1

bietet Etwas Google Guave

List<String> names = new ArrayList(Collections2.transform(foo.getBars(), new Function<Bar,String>() { 
    String apply(Bar bar) { 
     return bar.getName() 
    } 
}); 
+0

Obwohl ich es zugeben hat es nicht weniger vorformulierten machen ... – membersound

+0

Ja, aber typsicher und verstecke keine Logik –

-1

Gibt es einen Grund, warum Sie die MultiMap nicht von Googles Sammlung Rahmen geliefert verwenden könnte?

MultiMap

Dies wird eine Karte mit mehreren Schlüsselwerten ermöglichen.

So könnte man einen doppelten Schlüssel hat (im Gegensatz zu einer hashmap sagen) und zurück, alle Werte für die Schlüssel

Dann rufen Sie einfach auf der zugehörige Karte erhalten, die die gleiche Umsetzung wie Ihr erwartetes Beispiel wäre die " getAll“

bekommen

Sammlung get (@Nullable K key) Gibt eine Sammlung Ansicht aller mit einem Schlüssel verknüpften Werte. Wenn keine Zuordnungen in der Multimap den bereitgestellten Schlüssel haben, wird eine leere Auflistung zurückgegeben. Änderungen an der zurückgegebenen Sammlung aktualisieren die zugrundeliegende Multimap und umgekehrt.

Parameter: -: die Sammlung von Werten, die die Schlüsselkarten zu

3

Wenn Sie Eclipse Collections und ändern getBars() verwenden eine MutableList oder etwas ähnliches, Sie zurück Schlüssel Schlüssel für in multimap Returns suchen schreiben:

MutableList<String> names = foo.getBars().collect(new Function<Bar, String>() 
{ 
    public String valueOf(Bar bar) 
    { 
     return bar.getName(); 
    } 
}); 

Wenn Sie die Funktion als konstante auf Bar extrahieren, es verkürzt zu:

MutableList<String> names = foo.getBars().collect(Bar.TO_NAME); 

Mit Java 8 Lambdas benötigen Sie die Funktion überhaupt nicht.

MutableList<String> names = foo.getBars().collect(Bar::getName); 

Wenn Sie nicht den Rückgabetyp von getBars() ändern, können Sie es in einer ListAdapter wickeln.

MutableList<String> names = ListAdapter.adapt(foo.getBars()).collect(Bar.TO_NAME); 

Hinweis: Ich bin ein Committer für Eclipse-Kollektionen.

+0

Finde zwei Unterschiede mit Antwort von Guava Collections :) –

Verwandte Themen