如何从对象列表中获取Long列表

时间:2014-03-28 07:13:52

标签: java for-loop arraylist

我有一个具有以下属性的Person对象 -

private Long personId;
private String personName;

I want to get List<Long> from List<Person>

我想避免通过对象列表循环。如果有其他方式,请建议。

4 个答案:

答案 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。

两者都会比这个更多的代码,但我认为你应该得到这个想法。