使用现有列表中的字段创建新列表

Nic*_*ras 4 java collections field list

假设有一节课:

class Person
{
   String name;
   int age;
   City location;
}
Run Code Online (Sandbox Code Playgroud)

是否有一些库可以让我创建一个字符串列表,其中包含一行中人员列表中的每个名称,而不是创建新列表并循环浏览另一个列表?

就像是:

List<Person> people = getAllOfThePeople();
List<String> names = CoolLibrary.createList("name", people);
Run Code Online (Sandbox Code Playgroud)

而不是:

List<Person> people = getAllOfThePeople();
List<String> names = new LinkedList<String>();
for(Person person : people)
{
    names.add(person.getName());
}
Run Code Online (Sandbox Code Playgroud)

Ale*_* C. 13

您可以将Java 8与lambda表达式一起使用:

List<String> listNames = people.stream().map(u -> u.getName()).collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)
import java.util.*;
import java.util.function.*;
import java.util.stream.*;

public class Test {
  public static void main(String args[]){
    List<Person> people = Arrays.asList(new Person("Bob",25,"Geneva"),new Person("Alice",27,"Paris"));
    List<String> listNames = people.stream().map(u -> u.getName()).collect(Collectors.toList());
    System.out.println(listNames);
  }
}
class Person
{
   private String name;
   private int age;
   private String location;

  public Person(String name, int age, String location){
    this.name = name;
    this.age = age;
    this.location = location;
  }

  public String getName(){
    return this.name;
  }

}
Run Code Online (Sandbox Code Playgroud)

输出:

[Bob, Alice]
Run Code Online (Sandbox Code Playgroud)

在这里演示.


或者,您可以定义一个方法,该方法将列表作为参数,并且您要为此列表的每个元素应用函数:

public static <X, Y> List<Y> processElements(Iterable<X> source, Function <X, Y> mapper) {
    List<Y> l = new ArrayList<>();
    for (X p : source) 
        l.add(mapper.apply(p));
    return l;
}
Run Code Online (Sandbox Code Playgroud)

然后就做:

List<String> lNames = processElements(people, p -> p.getName()); //for the names
List<Integer> lAges = processElements(people, p -> p.getAge()); //for the ages
//etc.
Run Code Online (Sandbox Code Playgroud)

如果你想按年龄对人进行分组,那么Collectors该类提供了很好的实用程序(例如):

Map<Integer, List<Person>> byAge = people.stream()
                                         .collect(Collectors.groupingBy(Person::getAge));
Run Code Online (Sandbox Code Playgroud)