避免使用构造项添加到列表中的临时变量

时间:2017-08-11 18:17:01

标签: java algorithm arraylist lambda

Java 8具有许多功能,允许您避免使用临时变量和函数,似乎必须有一种方法可以避免使用这些临时值来创建此列表:

List<Phone> phones = new ArrayList<>();
Phone p1 = new Phone();
p1.setNumber(this.mainPhoneNumber);
p1.setExtension(this.mainPhoneExt);
p1.setType(this.mainPhoneDesc);
phones.add(p1);
Phone p2 = new Phone();
p2.setNumber(this.secondaryPhoneNumberOne);
p2.setExtension(this.secondaryPhoneExtOne);
p2.setType(this.secondaryPhoneDescOne);
phones.add(p2);
Phone p3 = new Phone();
p3.setNumber(this.secondaryPhoneNumberTwo);
p3.setExtension(this.secondaryPhoneExtTwo);
p3.setType(this.secondaryPhoneDescTwo);
phones.add(p3);

我有一堆丑陋的成员变量需要整理成一个列表。 <{1}}对象没有一个好的构造函数,我无法改变它。

如何在不定义三个临时对象Phone的情况下从成员变量创建此列表?

2 个答案:

答案 0 :(得分:4)

如果您可以修改Phone以使定位符可链接,那么您可以瞄准:

phones.add(
    new Phone()
        .setNumber(this.mainPhoneNumber)
        .setExtension(this.mainPhoneExt)
        .setType(this.mainPhoneDesc)
);

如果不可能,您可以创建外部构建器类。使用它看起来像:

phones.add(
    new PhoneBuilder()
        .number(this.mainPhoneNumber)
        .extension(this.mainPhoneExt)
        .type(this.mainPhoneDesc)
    .build()
);

实现构建器类很乏味,但很简单。将所有字段值存储在成员变量中,然后在调用Phone时创建实际的build()对象。您会发现自己重复了很多Phone方法名称。不要担心,这是正常的。

答案 1 :(得分:3)

你可以这样做吗?

public Phone phoneMaker(int number, int ext, string description) {
    Phone p = new Phone();
    p.setNumber(number);
    p.setExtension(ext);
    p.setType(description);
    return p;
}
List<Phone> phones = new ArrayList<>();
phones.add(phoneMaker(this.mainPhoneNumber, this.mainPhoneExt, this.mainPhoneDesc));