如何提取列表中特定属性的所有元素?

时间:2013-02-05 15:06:11

标签: java collections

我怎样才能最好地获得以下结构的所有“name”字符串元素:

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");

4 个答案:

答案 0 :(得分:3)

如果您使用Eclipse Collections并更改getBars()以返回MutableList或类似内容,您可以写:

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

如果在Bar上将函数提取为常量,则会缩短为:

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

使用Java 8 lambdas,根本不需要函数。

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

如果无法更改getBars()的返回类型,可以将其包装在ListAdapter中。

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

注意:我是Eclipse集合的提交者。

答案 1 :(得分:1)

有点提供Google番石榴

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

答案 2 :(得分:1)

使用Java 8:

UICollectionView

答案 3 :(得分:-1)

有没有理由不能使用Googles集合框架提供的MultiMap?

MultiMap

这将允许具有多个键值的地图。

所以你可以有一个重复的键(不像是一个hashmap)并返回该键的所有值

然后只需调用相关Map上的get,这与你想要的“getAll”示例的实现相同

  

获取

     

收集获取(@Nullable                     K key)返回与键关联的所有值的集合视图。如果multimap中没有映射   提供密钥后,将返回一个空集合。对返回的更改   集合将更新底层多图,反之亦然。

     

参数:key - 在multimap中搜索的键返回:   键映射到

的值的集合