我有一个具有以下属性的Person对象 -
private Long personId;
private String personName;
I want to get List<Long> from List<Person>
我想避免通过对象列表循环。如果有其他方式,请建议。
答案 0 :(得分:2)
没有办法避免在列表中循环;您可以使用for
循环手动执行此操作,也可以让库为您执行此操作(例如使用Google Guava函数或Java 8流)。如果您还没有使用Guava,最简单的方法就是:
List<Long> ids = new ArrayList(people.size());
for(Person p : people)
id.add(p.getPersonId());
答案 1 :(得分:0)
您可以使用第三方单元来完成目标:com.google.common.collect.Collections2.transform(collection,Function),尽管它也是循环集合内部。 PS:如何使用该方法的演示如下:
List<Long> personIds = Collection2.transform(persons, new Function<Person,Long>(){
@Override
public Long apply(@Nullable Person person) {
return person.getPersonId();
}
});
答案 2 :(得分:0)
List ids =(List)CollectionUtils.collect(objectList,new BeanToPropertyValueTransformer(“personId”));
答案 3 :(得分:0)
可以不使用第三方模块和无需迭代(并且无需编写太多代码):
只需为您的人员列表写一个Wrapper来访问ID:
static class PersonIdList extends AbstractList<Long> {
private final List<Person> wrapped;
public PersonIdList( List<Person> wrapped ){
this.wrapped = wrapped;
}
@Override
public Long get( int index ) {
return wrapped.get( index ).personId;
}
@Override
public int size() {
return wrapped.size();
}
}
可以这样使用:
List<Person> persons = Arrays.asList(
new Person( 1L, "Foo" ),
new Person( 2L, "Bar" ),
new Person( 3L, "Joshua" ) );
PersonIdList personIds = new PersonIdList( persons );
for( Long id : personIds ){
System.out.println( id );
}
此解决方案最适合使用随机访问列表(例如ArrayList)并且不太好 使用顺序列表(例如LinkedList)。
如果您需要链接列表并且性能是一个问题(大型链表,大型数据库结果),您可以扩展AbstractSequentialList及其Iterator或直接实现List和Iterator。
两者都会比这个更多的代码,但我认为你应该得到这个想法。