这是我的样本对象
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
过滤?< / p>
编辑:我很想知道如何以不同的方式完成它。
答案 0 :(得分:7)
您可以使用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());
答案 1 :(得分: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);
编辑:如果你以后找到一个不同的方法,你只需要替换方法体并“神奇地”所有正在使用新方法的地方。
答案 2 :(得分:2)
为了完整起见:您还可以使用LambdaJ
将其设为一行:
List<Long> ids = extract(dummyList, on(Dummy.class).getId());
详情请见LambdaJ's wiki。
请注意,此解决方案可能看起来比for循环更好,但执行得更糟,因为它在幕后使用代理,所以如果代码性能至关重要,我就不会使用它。请参阅LambdaJ here产生的性能损失分析。