如何从JAVA中的任何类的列表中复制特定的字段?
让我开始描述我的问题。
我有一个班,Person,存储在mPeople列表中。 所以这意味着人们会存储“名字”和“年龄”。 但是在某种情况下,我需要列出所有人的名字和所有人的年龄列表。
那么有没有办法将列表中某个类的特定字段中的所有数据复制到另一个列表或其他地方?
注意:我知道我可以使用for循环或增强循环来做到这一点,但通过它看起来不太好。 所以只是好奇,如果有人找到更好的解决方案…我会感谢您的帮助!
public class Person { // fields private int age; private String name; // constructor public Person( int age, String name ) { this.age = age; this.name = name; } // getter public int getAge() { return age; } public String getName() { return name; } } //list of People List<Person> mPeople = new ArrayList<>(); mPeople.add( new Person( 10, "Sovanara" ) ); mPeople.add( new Person( 20, "Dara" ) );
如果您正在使用Java 8,则可以映射流:
final List<String> names = mPeople.stream() .map( it -> it.getName()) .collect(Collectors.toList()); final List<Integer> ages= mPeople.stream() .mapToInt( it -> it.getAge()) .collect(Collectors.toList());
我在这里做了两次,告诉你他们每个人的样子。 如果你愿意一次传球,你可以在forEach
做这些副作用。 对于那些可能值得思考的大型人物,如果你对资源紧张的话。
编辑 :单通解决方案(这取决于副作用):
final List<String> names = new ArrayList<>(); final List<Integer> ages = new ArrayList<>(); mPeople.stream().forEach({ it -> names.add(it.getName()); ages.add(it.getAge()); });
由于您也将其标记为Kotlin,因此解决方案类似:
val names = mPeople.map { it.name } val ages = mPeople.map { it.age }
一个快速的解决方案将是使用流。
一个简单的例子可能看起来像这样:
List<Integer> mAges = new ArrayList<>(); List<String> mNames = new ArrayList<>(); mPeople.stream().forEach(p->{mAges.add(p.getAge()); mNames.add(p.getName()); } );
当然你需要使用正确的java版本。 为了好玩,我想我会添加一些方法来做到没有流,虽然我宁愿在这种情况下使用流。
可能是最基本的方法:
for(int i =0; i < mPeople.size();i++){ mAges.add(mPeople.get(i).getAge()); mNames.add(mPeople.get(i).getName()); }
其他方式:
for(Person p: mPeople){ mAges.add(p.getAge()); mNames.add(p.getName()); }