2013-02-05 86 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的答案有两个区别:) –

相关问题