Memetakan Daftar dengan ModelMapper

1. Ikhtisar

Dalam tutorial ini, kami akan menjelaskan cara memetakan daftar jenis elemen yang berbeda menggunakan kerangka ModelMapper. Ini melibatkan penggunaan tipe generik di Java sebagai solusi untuk mengonversi berbagai jenis data dari satu daftar ke daftar lainnya .

2. Pemeta Model

Peran utama ModelMapper adalah memetakan objek dengan menentukan bagaimana satu model objek dipetakan ke yang lain yang disebut Data Transformation Object (DTO).

Untuk menggunakan ModelMapper, kita mulai dengan menambahkan ketergantungan ke pom.xml kita :

 org.modelmapper modelmapper 2.3.7 

2.1. Konfigurasi

ModelMapper menyediakan berbagai konfigurasi untuk menyederhanakan proses pemetaan. Kami menyesuaikan konfigurasi dengan mengaktifkan atau menonaktifkan properti yang sesuai di konfigurasi. Ini adalah praktik umum untuk menyetel properti fieldMatchingEnabled ke true dan mengizinkan pencocokan bidang pribadi :

modelMapper.getConfiguration() .setFieldMatchingEnabled(true) .setFieldAccessLevel(Configuration.AccessLevel.PRIVATE); 

Dengan demikian, ModelMapper dapat membandingkan bidang privat di kelas pemetaan (objek). Dalam konfigurasi ini, tidak semua kolom dengan nama yang sama harus ada di kedua kelas. Beberapa Strategi Pencocokan diperbolehkan. Secara default, strategi pencocokan standar mengharuskan semua properti sumber dan tujuan harus cocok dalam urutan apa pun. Ini ideal untuk skenario kami .

2.2. Ketik Token

ModelMapper menggunakan TypeToken untuk memetakan tipe umum. Untuk melihat mengapa ini diperlukan, mari kita lihat apa yang terjadi ketika kita memetakan daftar Integer ke daftar Karakter :

List integers = new ArrayList(); integers.add(1); integers.add(2); integers.add(3); List characters = new ArrayList(); modelMapper.map(integers, characters);

Selanjutnya, jika kita mencetak elemen dari daftar karakter kita akan melihat daftar kosong. Ini karena terjadinya penghapusan tipe selama eksekusi runtime.

Jika kita mengubah panggilan peta kita untuk menggunakan TypeToken , kita bisa membuat tipe literal untuk List :

List characters = modelMapper.map(integers, new TypeToken
    
     () {}.getType());
    

Pada waktu kompilasi, inner case anonim TokenType mempertahankan jenis parameter List , dan kali ini konversi kami berhasil.

3. Menggunakan Pemetaan Jenis Kustom

Daftar di Java dapat dipetakan menggunakan jenis elemen kustom.

Misalnya, kita ingin memetakan daftar entitas Pengguna ke daftar UserDTO . Untuk mencapai ini, kami akan memanggil peta untuk setiap elemen:

List dtos = users .stream() .map(user -> modelMapper.map(user, UserDTO.class)) .collect(Collectors.toList());

Tentu saja, dengan beberapa pekerjaan lagi, kita bisa membuat metode parameter untuk tujuan umum:

 List mapList(List source, Class targetClass) { return source .stream() .map(element -> modelMapper.map(element, targetClass)) .collect(Collectors.toList()); }

Jadi, kita dapat melakukan:

List userDtoList = mapList(users, UserDTO.class);

4. Ketik Peta dan Pemetaan Properti

Properti khusus seperti daftar atau kumpulan dapat ditambahkan ke model User-UserDTO . TypeMap menyediakan metode untuk secara eksplisit menentukan pemetaan properti ini. The TypeMap objek toko pemetaan informasi dari tipe tertentu (kelas):

TypeMap typeMap = modelMapper.createTypeMap(UserList.class, UserListDTO.class);

Kelas UserList berisi kumpulan Pengguna . Di sini, w e ingin memetakan daftar nama pengguna dari koleksi ini ke daftar properti dari UserListDTO kelas . Untuk mencapai ini, kita akan membuat kelas UsersListConverter pertama dan meneruskannya Daftar dan Daftar sebagai jenis parameter untuk konversi:

public class UsersListConverter extends AbstractConverter
    
      { @Override protected List convert(List users) { return users .stream() .map(User::getUsername) .collect(Collectors.toList()); } }
    

Dari objek TypeMap yang dibuat, kami secara eksplisit menambahkan Pemetaan Properti dengan memanggil instance kelas UsersListConverter :

 typeMap.addMappings(mapper -> mapper.using(new UsersListConverter()) .map(UserList::getUsers, UserListDTO::setUsernames));

Di dalam metode addMappings , pemetaan ekspresi memungkinkan kita untuk menentukan sumber ke properti tujuan dengan ekspresi lambda. Akhirnya, ini mengubah daftar pengguna menjadi daftar nama pengguna yang dihasilkan.

5. Kesimpulan

Dalam tutorial ini, kami menjelaskan bagaimana daftar dipetakan dengan memanipulasi tipe umum di ModelMapper . Kita dapat menggunakan TypeToken, pemetaan tipe generik, dan pemetaan propertiuntuk membuat tipe daftar objek dan membuat pemetaan yang kompleks.

Kode sumber lengkap untuk artikel ini tersedia di GitHub.