2

这是我的示例对象

public class Dummy {
    private long id;
    private String name;
    /**
     * @return the id.
     */
    public long getId() {
        return id;
    }
    /**
     * @param id the id to set.
     */
    public void setId(long id) {
        this.id = id;
    }
    /**
     * @return the name.
     */
    public String getName() {
        return name;
    }
    /**
     * @param name the name to set.
     */
    public void setName(String name) {
        this.name = name;
    }

}

我的问题是我有这些对象的列表,我需要获取列表中该对象中存在的 id 列表。我可以很容易地做到这一点

List<Long> ids = Lists.newArrayList();
for(Dummy dummy: dummyList){
 ids.add(dummy.getId()); 
}

我想知道是否可以通过使用替代方法来完成(而不是使用 for 循环可能是?)而不是我想出的可能是使用IterablesCollections过滤?

编辑:我有兴趣知道如何以不同于我想出的方式完成它。

4

3 回答 3

14

使用番石榴

您可以使用Iterables.transform获取索引的 Iterable:

List<Dummy> dummyList = Lists.newArrayList();
Iterable<Long> idList = Iterables.transform(dummyList, new Function<Dummy, Long>() {
    public Long apply(Dummy dummy) { return dummy.getId(); };
});

但这似乎真的有点矫枉过正。你获得了一行,但你失去了可读性。

使用 Java 8

从 Java 8 开始,你有了闭包,你可以用更简洁的方式编写它。

List<Long> idList = dummyList
            .stream()
            .map(Dummy::getId)
            .collect(Collectors.toList());
于 2013-03-14T18:10:39.657 回答
2

没有办法让它更短,这是完成工作所需的最少工作量。

你可以做什么,如果你发现你在很多地方都在这样做,那么你可以用它来做一个方法:

public static List<Long> getIds(final List<Dummy> dummyList)
{
    List<Long> ids = Lists.newArrayList();
    for(Dummy dummy: dummyList){
        ids.add(dummy.getId());   
    } 
}

进而:

List<Long> ids = getIds(dummyList);

编辑:如果您以后确实找到了不同的方法,您只需替换方法主体,并且“神奇地”您正在做的所有地方都将使用新方法。

于 2013-03-14T18:03:03.353 回答
2

为了完整起见:您还可以使用LambdaJ使其成为单线:

List<Long> ids = extract(dummyList, on(Dummy.class).getId());

在LambdaJ 的 wiki上查看更多详细信息。

请注意,此解决方案可能看起来比 for 循环更好,但性能更差,因为它在幕后使用代理,所以如果代码对性能至关重要,我不会使用它。请参阅此处对 LambdaJ 造成的性能损失的一些分析。

于 2013-03-14T18:30:46.340 回答