Java 如何截断列表以提供专门化

Java 如何截断列表以提供专门化,java,list,encapsulation,truncate,Java,List,Encapsulation,Truncate,让我们想象一下电话和个人界面: public interface Phone { String getNumber(); // ... } public interface Person { String getName(); List<Phone> getPhones(); // ... } 如何将列表转换为列表,而不迭代所有项目?您是否有其他Person实现?因为在你的人物列表中,你必须放置一个具体类的对象。那么你为什么不从一开始就实例

让我们想象一下
电话
个人
界面:

public interface Phone {
    String getNumber();
    // ...
}

public interface Person {
    String getName();
    List<Phone> getPhones();
    // ...
}

如何将
列表
转换为
列表
,而不迭代所有项目?

您是否有其他Person实现?因为在你的人物列表中,你必须放置一个具体类的对象。那么你为什么不从一开始就实例化PhonedPerson呢?@JPMoresmau,确实有
PersonImpl
,它的数据是从数据库返回的,但存储库将其返回为
Person
,所以我试图将其截断为
PhonedPerson
,为一个对象执行它,但我不明白什么不起作用?您可以使用一个函数将一个人转换为一个电话用户,这样您就可以在PersonImpl列表上运行CollectionUtils.collect。我想知道为什么仅仅做
(list)persons
不起作用,而假设
(PhonedPerson)Person
起作用。如果我使用
collect
foreach
,我将重复两次,一次在controller上,另一次在view上,如果可能的话,我也希望避免这种情况。您从PersonImpl到PhonedPerson的转换可能会编译,但在运行时当然不会工作。与从数据库检索数据所花费的时间相比,在java对象上再次循环以将其变异为新实例的时间不会太长。另外,不要让PhonedPerson实现Person,只要让它将Person保存在一个字段中,就不需要复制整个对象。
abstract class PhonedPerson implements Person {
    private String phoneNumbers;

    public String getPhoneNumbers() {
        if (phoneNumbers == null) {
            phoneNumbers = StringUtils.join(
                CollectionUtils.collect(getPhones(), new Transformer() {
                    @Override
                    public Object transform(Object input) {
                        return ((Phone) input).getNumber();
                    }
                }),
                ", "
            );
        }
        return phoneNumbers;
    }
}