2014-03-28 19 views
0

的名單得到龍的名單上有以下有屬性 -如何從對象

private Long personId; 
private String personName; 

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

我想避免循環直通對象列表Person對象。如果有其他方式,請提出建議。

+3

請提一下你試過的東西...和你的輸入和輸出...這似乎是一個非常模糊的問題 –

+0

Mithun.ask與實際輸入和預期的輸出和快速回答的目標 – Kathir

+0

爲什麼你想要避免循環?這是一個風格問題還是性能問題? – Scheintod

回答

0

您可以使用第三方單位完成目標:com.google.common.collect.Collections2.transform(集合,函數),雖然它也是循環集合內部。 PS:如何使用方法的演示是這樣的:

List<Long> personIds = Collection2.transform(persons, new Function<Person,Long>(){ 
     @Override 
     public Long apply(@Nullable Person person) { 
      return person.getPersonId(); 
     } 
    }); 
2

有沒有辦法避免通過列表循環;您可以使用for循環手動執行此操作,也可以讓一個庫爲您執行此操作(例如使用Google Guava函數或Java 8流)。如果你還沒有使用番石榴最簡單的方法很簡單:

List<Long> ids = new ArrayList(people.size()); 
for(Person p : people) 
    id.add(p.getPersonId()); 
+0

理想有一種方法。如果你必須處理大型列表,這是非常有意義的。請看我的答案。 – Scheintod

0

列表ID =(列表)CollectionUtils.collect(鏈表類,新BeanToPropertyValueTransformer( 「PERSONID」));

0

這是可能的,而無需使用第三方模塊和不反覆(也無需編寫代碼太多):

只寫你的個人列表中的包裝,其訪問的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)而不是那麼好的 與順序列表(例如,鏈表)。

如果你需要它的鏈表和性能是一個問題(大鏈表,大型數據庫的結果),你可以擴展AbstractSequentialList及其迭代器或直接實現List和Iterator。

兩個會比這多了一個代碼,但我認爲這一個,你應該明白我的意思。