是否可以创建包含多个参数的多个对象的列表?

时间:2019-04-10 14:16:34

标签: java

简化示例

想象一下,我将一个人定义为:

public class Person (String name, int age)

然后我有一个人列表...

public class ListOfPeople {
     private ArrayList<Person> people;
}

然后我希望能够一次性创建几个人,做类似的事情...

ListOfPeople myFriends = new ListOfPeople("Chris",33,"Adam",26,"John",50)

我知道我可以分别初始化每个对象,然后添加它们,我很好奇我是否可以通过上述方式“即时”创建它们

3 个答案:

答案 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}]