2012-05-28 13 views
2

我有一個類,如:的Java轉換類

Student 
-name 
-surname 
-address 
-number 

,我有一個DTO它想:

StudentDTO 
-name 
-surname 
-number 

我會送我的學生類到另一個類只是名字,姓氏和數字字段(我的意思不是所有字段),我決定將它命名爲DTO(我沒有使用序列化等等,只是將這個類的對象作爲參數發送給其他類的方法)。

但是讓我們假設我有一個這樣的一行代碼:

getAllStudents(); 

,並返回:

List<Student> 

,但我想它分配給一個變量:

List<StudentDTO> 

我怎樣才能將它們轉換容易嗎?

PS:我無法更改我的getAllStudents();方法裏面。我有學生名單,想要一種快速和精心設計的方式將對象列表轉換爲另一個對象列表。

+0

@Jeffrey我已經編輯我的問題。 – kamaci

+0

然後不要打擾使用getAllStudents()方法。把你的清單,並把它扔到另一種方法,你*可以*修改。 –

回答

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; 
+0

學生了解StudentDTO是一個好主意嗎?我傾向於在需要轉換bean的情況下使用'Converter '接口。這也使您可以選擇使用功能樣式將轉換器應用於每個列表元素。 – hertzsprung

0

你可以從StudentDTO擴展學生:

public class StudentDTO { 
    name; 
    surname; 
    number; 
} 

public class Student extends StudentDTO { 
    address; 
} 

比你可以這樣做:

List<StudentDTO> dtoList = new ArrayList<StudentDTO>(getAllStudents()); 
+0

即使'Student'擴展'StudentDTO',您也不能將'List ''隱式轉換爲'List ' –

+0

您不必更改getAllStudents();方法 – alexey28

+0

你有沒有至少試圖做一些像'List lsDTO;列表 ls; = new ArrayList (); lsDTO = ls;'? –

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答案。

+0

好方法。不過,我編輯了我的問題,我不能更改該方法內的代碼。 – kamaci

+0

@kamaci回答編輯 –

+0

我得到一個服務類的所有學生,它的界面定義是列表。更改方法定義不是問題,但我有許多其他不同的類(如經理,講師等),並且更改所有方法定義並不容易。 – kamaci

2

使用Apache公地的BeanUtils:

PropertyUtils.copyProperties(studentDtoBean, studentBean); 
+1

雖然很簡單,但我不認爲引入依賴關係是值得的。 –

+0

@DavidB我認爲commons-beanutils在大多數應用程序中都存在,因爲許多開源庫都使用它,所以可能這種依賴性已經存在。 – Pino