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

4

4 回答 4

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 lambda,您根本不需要 Function。

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

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

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

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

于 2013-02-05T22:18:51.523 回答
1

有点提供谷歌番石榴

List<String> names = new ArrayList(Collections2.transform(foo.getBars(), new Function<Bar,String>() {
    String apply(Bar bar) {
        return bar.getName()
    }
});
于 2013-02-05T15:10:44.500 回答
1

使用 Java 8:

List<String> names =        
    foo.getBars().stream().map(Bar::getName).collect(Collectors.toList());
于 2017-06-21T22:14:20.993 回答
-1

你有什么理由不能使用谷歌集合框架提供的 MultiMap 吗?

多重地图

这将允许具有多个键值的映射。

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

然后只需在关联的 Map 上调用 get,这将与您预期的“getAll”示例相同的实现

得到

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

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

于 2013-02-05T15:12:18.217 回答