2

我有一个像这样的课程:

Student
-name
-surname
-address
-number

我有一个 DTO,比如:

StudentDTO
-name
-surname
-number

我会将我的学生班级发送到另一个班级,仅包含姓名、姓氏和数字字段(我的意思不是所有字段),我决定将其命名为 DTO(我没有使用序列化等。只是我将这个班级的对象作为参数发送到任何其他类的方法)。

但是,让我们假设我有一行这样的代码:

getAllStudents();

它返回:

List<Student>

但我想将它分配给一个变量:

List<StudentDTO>

如何轻松转换它们?

PS:我不能改变我的getAllStudents(); 方法在里面。我有学生列表,并且想要一种快速且设计良好的方法将对象列表转换为另一个对象列表。

4

4 回答 4

2

使用 Apache commons-beanutils:

PropertyUtils.copyProperties(studentDtoBean, studentBean);
于 2012-05-28T14:36:27.077 回答
0
public StudentDTO convert() {
    StudentDTO newDTO = new StudentDTO(name, surname, number);
    return newDTO;
}

您可以将其实现为公共方法。

显然,这将被抽象为一个更大的转换方法,可以进行批处理。另一种选择是实现 Cloneable 并仅为 Student -> StudentDTO 创建一个特定的实现。

迭代示例:

List<StudentDTO> myList = new ArrayList<>();
    for (Student s : collection) {
        myList.add(s.convert());
    }
    return myList;
于 2012-05-28T14:05:00.380 回答
0

您可以从 StudentDTO 扩展 Student:

public class StudentDTO {
    name;
    surname;
    number;
}

public class Student extends StudentDTO {
    address;
}

比你能做的:

List<StudentDTO> dtoList = new ArrayList<StudentDTO>(getAllStudents());
于 2012-05-28T14:11:54.070 回答
0

您可以尝试更改StudentDTO以扩展Student

public StudentDTO extends Student {
}

请记住,您可以拥有该address属性但无需使用它。如果你能做到,那么只需将你的方法的结果更改为:

public List<? extends Student> getAllStudents() {
    List<StudentDTO> lsStudentDTO = new ArrayList<StudentDTO>();
    //fill the list...
    return lsStudentDTO;
}

编辑:

您不是在更改内部代码,而是在更改方法定义:)。此外,您总是可以扩展方法,也许是

public List<? extends Student> getAllStudentsDTO() {
    //maybe you should add another logic here...
    return getAllStudents();
}

如果您甚至无法更改此行为,请使用@DavidB 回答。

于 2012-05-28T14:12:24.817 回答