想象一下,我将一个人定义为:
public class Person (String name, int age)
然后我有一个人列表...
public class ListOfPeople {
private ArrayList<Person> people;
}
然后我希望能够一次性创建几个人,做类似的事情...
ListOfPeople myFriends = new ListOfPeople("Chris",33,"Adam",26,"John",50)
我知道我可以分别初始化每个对象,然后添加它们,我很好奇我是否可以通过上述方式“即时”创建它们
答案 0 :(得分:5)
您可以执行以下操作:
List<Person> personListConstructor(String... data) {
List<Person> personList = new ArrayList<>();
for (int i = 0; i < data.length / 2; i++) {
personList.add(new Person(data[2 * i], Integer.parseInt(data[2 * i + 1])));
}
return personList;
}
当然,它缺乏验证-参数必须是偶数,每秒必须是整数。其他解决方案是使用Object
s数组:
List<Person> personListConstructor(Object... data) {
List<Person> personList = new ArrayList<>();
for (int i = 0; i < data.length / 2; i++) {
personList.add(new Person((String) data[2 * i], (Integer) data[2 * i + 1]));
}
return personList;
}
这里有同样的提示。
答案 1 :(得分:4)
您可以创建一个接受Person
对象数组的构造函数:
public class ListOfPeople {
private ArrayList<Person> people;
public ListOfPeople(Person... persons) {
for (Person person : persons) {
people.add(person);
}
}
}
并像这样使用它:
ListOfPeople myFriends = new ListOfPeople(new Person("Chris", 33), new Person("Adam",26), new Person("John",50));
答案 2 :(得分:3)
想知道如何使用lambda进行操作,如果有人感兴趣,这是简单的解决方案。
public class Person {
String name;
int age;
public Person(List<String> attributes) {
attributes.stream().findFirst().ifPresent(this::setName);
attributes.stream().skip(1).findFirst().map(Integer::parseInt).ifPresent(this::setAge);
}
// getters, setters
}
public class ListOfPersons {
List<Person> people;
public ListOfPersons(String ...persons) {
final int chunkSize = 2;
final AtomicInteger counter = new AtomicInteger();
this.people = Stream.of(persons)
.collect(Collectors.groupingBy(it -> counter.getAndIncrement() / chunkSize))
.values()
.stream()
.map(Person::new)
.collect(Collectors.toList());
System.out.println(Arrays.toString(this.people.toArray()));
}
}
所以新的new ListOfPersons("A", "1", "B", "2", "C")
返回
[Person{name='A', age=1}, Person{name='B', age=2}, Person{name='C', age=0}]