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;
}
}