Java – 从列表/数组中的每个对象获取单个属性的最简单方法?

假设我有一个人物对象,其namehair coloreye color等属性。 我有以下数组Person[] people ,其中包含人物对象的实例。

我知道我可以获得一个Person对象的name属性

 // create a new instance of Person Person george = new Person('george','brown','blue'); // <<>> // access the name property String georgesName = people[0].name; 

但是如果我想在不使用索引的情况下访问每个人的name属性呢? 例如,要创建一个只是名称或头发颜色的数组或列表? 我是否必须手动遍历我的peoplearrays? 或者像String[] peopleNames = people.name这样的Java有什么String[] peopleNames = people.name吗?

两种选择:

  1. 迭代
  2. Streams( Java 8

迭代

 List names = new ArrayList<>(); for (Person p : people) { names.add(p.name); } 

 String[] names = Arrays.stream(people).map(p -> p.name).toArray(size -> new String[people.length]); 

java 8:

 String[] names = Arrays.asStream(people).map(Person::getName).asArray(String[]::new); 

您正在寻求最初仅限命令式语言Java的function特性。 正如在其他答案中已经提到的,自Java 8以来,您还具有function元素(例如,流)。 但是,尚未建议使用它们。 这篇博客文章解释了流循环的缺点(即性能,可读性,可维护性)。

如果您正在寻找function和安全的代码而没有这些重大影响,请尝试使用Scala:

 case class Person(name: String) val persons = Array(Person("george"), Person("michael"), Person("dexter")) val personNames = persons.map(_.name) 

主要区别在于此Scala代码易于阅读,并且作为使用循环的Java代码具有相对性能,因为已转换的Scala-to-Java代码在内部使用while循环。