这是我拥有的示例对象
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 循环?)而不是我想出的可能使用
Iterables
或 Collections
过滤?
编辑:我有兴趣知道如何以与我想出的不同的方式完成它。
您可以使用
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 开始,你有了闭包,你可以用更简洁的方式编写它。
List<Long> idList = dummyList
.stream()
.map(Dummy::getId)
.collect(Collectors.toList());
LambdaJ
使其成为单行:
List<Long> ids = extract(dummyList, on(Dummy.class).getId());
在 LambdaJ 的 wiki 上查看更多详细信息。
请注意,这个解决方案可能看起来比 for 循环更好,但性能要差得多,因为它在幕后使用代理,所以如果代码对性能至关重要,我不会使用它。请参阅此处对 LambdaJ 造成的性能损失的一些分析。
没有办法让它更短,这是完成工作所需的最小工作量。
你可以做什么,如果你发现你在很多地方都这样做,那么就从中制定一个方法:
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);
编辑:如果您稍后确实找到了不同的方法,您只需替换方法主体,并且“神奇地”您正在做的所有地方都将使用新方法。
List<Long> idList = dummyList
.stream()
.map(d -> d.getId())
.collect(Collectors.toList());