【问题标题】:How to extract all elements of a specific property in a list?如何提取列表中特定属性的所有元素?
【发布时间】:2013-02-05 15:06:10
【问题描述】:

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

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

【问题讨论】:

  • 等待 Java 8 ;-)

标签: java collections


【解决方案1】:

如果您使用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,您根本不需要函数。

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

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

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

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

【讨论】:

  • 从 Guava Collections 的答案中找出两个不同之处 :)
【解决方案2】:

使用 Java 8:

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

【讨论】:

    【解决方案3】:

    有点提供谷歌番石榴

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

    【讨论】:

    • 是的,但类型安全且不隐藏逻辑
    【解决方案4】:

    您有什么理由不能使用 Google 集合框架提供的 MultiMap?

    MultiMap

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

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

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

    得到

    集合获取(@Nullable K key) 返回与某个键关联的所有值的集合视图。如果多重映射中没有映射具有 提供键,返回一个空集合。退货的变化 集合将更新底层多图,反之亦然。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-22
      • 1970-01-01
      相关资源
      最近更新 更多