2013-02-05 85 views
5

我如何才能最好地讓所有的「名」以下結構的字符串元素:如何提取列表中特定屬性的所有元素?

class Foo { 
    List<Bar> bars; 
} 

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

我的做法是:

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

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

這可能會實現,但是是不是有東西在java中。 Collections我可以這樣寫: Collections.getAll(foo.getBars(), "name");

+3

只是等待的Java 8 ;-) –

回答

1

使用Java 8:

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

有點提供谷歌番石榴

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

雖然我不得不承認這並不能使它少樣板... – membersound

+0

是的,但類型安全,不要隱藏邏輯 –

-1

是否有任何理由,你爲什麼不能使用谷歌通過收集框架提供的多重映射?

MultiMap

這將使具有多個鍵值的地圖。

所以,你可以有一個重複鍵(不像說是一個HashMap)和返回所有的值是關鍵

然後,只需調用get相關的地圖,這將是相同的實現爲「您的預計例如GETALL」

得到

collection來(@Nullable K key)返回一個鍵相關聯的所有值的集合視圖。如果多圖中沒有映射提供密鑰 ,則返回空集合。對返回的 集合的更改將更新底層多圖,反之亦然。

參數:key - 要搜索的多重映射返回: 集合的鍵映射到

3

如果使用Eclipse Collections值,改變getBars()返回一個MutableList或類似的東西,你可以這樣寫:

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

如果提取功能上酒吧常數,它縮短了:

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

使用Java 8 lambda表達式,根本不需要函數。

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

如果無法更改getBars()的返回類型,則可以將其包裝在ListAdapter中。

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

注:我的Eclipse藏品的參與者。

+0

找到與Guava Collections的答案有兩個區別:) –

相關問題