Java – 从列表/数组中的每个对象获取单个属性的最简单方法?
假设我有一个人物对象,其name
, hair color
和eye 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
属性呢? 例如,要创建一个只是名称或头发颜色的数组或列表? 我是否必须手动遍历我的people
arrays? 或者像String[] peopleNames = people.name
这样的Java有什么String[] peopleNames = people.name
吗?
两种选择:
- 迭代
- 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循环。