2013-02-05 2 views
5

jak mogę najlepiej uzyskać wszystkie „nazwy” elementy strunowe o następującej strukturze:Jak wyodrębnić wszystkie elementy określonej właściwości na liście?

class Foo { 
    List<Bar> bars; 
} 

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

Moje podejście byłoby:

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

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

to może działać, ale nie jest coś w Javie. Collections gdzie mogę napisać tak: Collections.getAll(foo.getBars(), "name");?

+3

Tylko czekać Java 8 ;-) –

Odpowiedz

1

Korzystanie Java 8:

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

Nieco zapewnia Google guawa

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

Choć muszę przyznać, że nie czyni go mniej boilerplate ... – membersound

+0

Tak, ale bezpiecznie i nie ukrywaj logiki –

-1

Czy jest jakiś powód, dla którego nie można użyć dostarczonego przez Multimap Googles ramach zbiórki?

MultiMap

Pozwoli mapę z wielu wartości kluczowych.

Więc można mieć duplikat klucza (w przeciwieństwie powiedzieć HashMap) i zwrócić wszystkie wartości dla tego klucza

Następnie wystarczy zadzwonić dostać się na powiązanej Mapa, która byłaby taka sama realizacja jak planowanej przykład " getAll”

dostać

Collection get (@Nullable klawisz K) Zwraca Zobacz kolekcję wszystkich wartości związanych z kluczem. Jeśli żadne odwzorowania w multimap nie mają podanego klucza, zwracana jest pusta kolekcja. Zmiany w zwróconej kolekcji zaktualizują podstawową multimapę i na odwrót.

Parametry: key - klucz, aby szukać w Multimap Returns: the zbiór wartości, że kluczowe mapy do

3

Jeśli używasz Eclipse Collections i zmienić getBars(), aby powrócić do MutableList lub coś podobnego, ty można napisać:

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

Jeśli wyodrębnić funkcjonować jako stały na barze, skraca do:

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

Z 8 lambda Java, w ogóle nie potrzebujesz tej funkcji.

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

Jeśli nie możesz zmienić typu powrotu getBars(), możesz zawinąć go w ListAdapter.

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

Uwaga: Jestem committer dla zbiorów Eclipse.

+0

znajdź dwie różnice z odpowiedzią kolekcji Guava :) –