2016-04-14 43 views
1

我有下面的類:創建新的目錄中只提取一個字段

public class Person { 
    private Integer id; 
    private String name; 
    private String address; 
    ... 
} 

在我的代碼的某一點,我建立人名單:

List<Person> people = getPeople(); 

我需要什麼是僅在原始列表的字段id中創建新列表。當然,我可以遍歷列表並創建一個新的:

List<Integer> idsList = new ArrayList<Integer>(); 
for (Person person: people){ 
    idsList.add(person.getId()); 
} 

但我不知道是否有辦法做到這一點,而無需迭代。

我正在使用JDK6。

非常感謝你提前

+7

- 僅在JDK8中。 – EpicPandaForce

+0

你不能讓'List 'Map '。你有兩個'List'作爲關鍵字和值集想要做什麼,同時也可以在'n(1)'時間內通過id獲得'Person'。 – SomeJavaGuy

+0

@KevinEsche,恐怕我不能,因爲這個列表在我的代碼中被用於許多其他類中 – Genzotto

回答

3

這取決於你需要與List做什麼。如果你需要一個ID ArrayList,那麼你將不得不遍歷

public static List<Integer> idList(final List<Person> people) { 
    return new AbstractList<Integer>() { 
     @Override 
     public Integer get(int index) { 
      return people.get(index).getId(); 
     } 
     @Override 
     public int size() { 
      return people.size(); 
     } 
    }; 
} 

:如果你很高興爲它是原始列表的ID的看法,你不能直接修改,你可以做到這一點。

1

在Java8:

List<Person> people = getPeople(); 
List<Integer> ids = people.stream() 
    .map(Person::getId) 
    .collect(Collectors.toList()); 

編輯 對不起都沒有注意到的JDK版本。

對於J6 +番石榴這將是:

List<Person> people = getPeople(); 
List<Integer> ids = FluentIterable.from(people) 
.transform(new Function<Person, Integer>() { 
    @Override 
    public Integer apply(Person person) { 
     return person.getId(); 
    } 
}).toList(); 

您可以將功能明顯提取到一些靜態變量,以使其更清晰。

private static final Function<Person, Integer> TO_ID = new Function<Person, Integer>() { 
    @Override public Integer apply(Person person) { 
     return person.getId(); 
    } 
}; 

public static void main(String [] args) { 
    List<Person> people = getPeople(); 
    List<Integer> ids = FluentIterable.from(people) 
      .transform(TO_ID) 
      .toList(); 
} 
0

只是在這裏傾倒想法。

當代碼將人物對象添加到列表中時,爲什麼不直接將該ID添加到列表中?這是爲了讓你的身份證號碼在飛行中保持不變,你不必循環訪問人員列表來創建最終的ID列表?

請讓我知道如果我不完全理解您的問題