Cara Mengubah Daftar ke Peta di Jawa

1. Ikhtisar

Mengubah Daftar ke Peta adalah tugas umum. Dalam tutorial ini, kami akan membahas beberapa cara untuk melakukan ini.

Kami akan berasumsi bahwa setiap elemen Daftar memiliki pengenal yang akan digunakan sebagai kunci dalam Peta yang dihasilkan .

2. Contoh Struktur Data

Pertama, mari buat model elemen:

public class Animal { private int id; private String name; // constructor/getters/setters }

The id bidang unik, maka kita bisa membuatnya kunci.

Mari mulai berkonversi dengan cara tradisional.

3. Sebelum Java 8

Terbukti, kita dapat mengubah Daftar menjadi Peta menggunakan metode inti Java:

public Map convertListBeforeJava8(List list) { Map map = new HashMap(); for (Animal animal : list) { map.put(animal.getId(), animal); } return map; }

Mari kita uji konversinya:

@Test public void whenConvertBeforeJava8_thenReturnMapWithTheSameElements() { Map map = convertListService .convertListBeforeJava8(list); assertThat( map.values(), containsInAnyOrder(list.toArray())); }

4. Dengan Java 8

Dimulai dengan Java 8 kita dapat mengubah Daftar menjadi Peta menggunakan aliran dan Kolektor :

 public Map convertListAfterJava8(List list) { Map map = list.stream() .collect(Collectors.toMap(Animal::getId, animal -> animal)); return map; }

Sekali lagi, mari pastikan konversi dilakukan dengan benar:

@Test public void whenConvertAfterJava8_thenReturnMapWithTheSameElements() { Map map = convertListService.convertListAfterJava8(list); assertThat( map.values(), containsInAnyOrder(list.toArray())); }

5. Menggunakan Perpustakaan Guava

Selain inti Java, kita dapat menggunakan pustaka pihak ke-3 untuk konversi.

5.1. Konfigurasi Maven

Pertama, kita perlu menambahkan dependensi berikut ke pom.xml kita :

 com.google.guava guava 23.6.1-jre 

Versi terbaru pustaka ini selalu dapat ditemukan di sini.

5.2. Konversi Dengan Maps.uniqueIndex ()

Kedua, mari gunakan metode Maps.uniqueIndex () untuk mengubah Daftar menjadi Peta :

public Map convertListWithGuava(List list) { Map map = Maps .uniqueIndex(list, Animal::getId); return map; }

Terakhir, mari kita uji konversinya:

@Test public void whenConvertWithGuava_thenReturnMapWithTheSameElements() { Map map = convertListService .convertListWithGuava(list); assertThat( map.values(), containsInAnyOrder(list.toArray())); } 

6. Menggunakan Library Apache Commons

Kami juga dapat membuat konversi denganmetode pustaka Apache Commons.

6.1. Konfigurasi Maven

Pertama, mari kita sertakan ketergantungan Maven:

 org.apache.commons commons-collections4 4.2 

Versi terbaru dari ketergantungan ini tersedia di sini.

6.2. MapUtils

Kedua, kami akan membuat konversi menggunakan MapUtils.populateMap () :

public Map convertListWithApacheCommons2(List list) { Map map = new HashMap(); MapUtils.populateMap(map, list, Animal::getId); return map; }

Terakhir, mari pastikan berfungsi seperti yang diharapkan:

@Test public void whenConvertWithApacheCommons2_thenReturnMapWithTheSameElements() { Map map = convertListService .convertListWithApacheCommons2(list); assertThat( map.values(), containsInAnyOrder(list.toArray())); }

7. Konflik Nilai

Mari kita periksa apa yang terjadi jika kolom id tidak unik.

7.1. Daftar dari Hewan Dengan Digandakan Id s

Pertama, mari kita membuat Daftar dari Animal s dengan non-unik id s:

@Before public void init() { this.duplicatedIdList = new ArrayList(); Animal cat = new Animal(1, "Cat"); duplicatedIdList.add(cat); Animal dog = new Animal(2, "Dog"); duplicatedIdList.add(dog); Animal pig = new Animal(3, "Pig"); duplicatedIdList.add(pig); Animal cow = new Animal(4, "Cow"); duplicatedIdList.add(cow); Animal goat= new Animal(4, "Goat"); duplicatedIdList.add(goat); }

Seperti yang ditunjukkan di atas, sapi dan kambing memiliki id yang sama .

7.2. Memeriksa Perilaku

Java Map‘s put() method is implemented so that the latest added value overwrites the previous one with the same key.

For this reason, the traditional conversion and Apache Commons MapUtils.populateMap() behave in the same way:

@Test public void whenConvertBeforeJava8_thenReturnMapWithRewrittenElement() { Map map = convertListService .convertListBeforeJava8(duplicatedIdList); assertThat(map.values(), hasSize(4)); assertThat(map.values(), hasItem(duplicatedIdList.get(4))); } @Test public void whenConvertWithApacheCommons_thenReturnMapWithRewrittenElement() { Map map = convertListService .convertListWithApacheCommons(duplicatedIdList); assertThat(map.values(), hasSize(4)); assertThat(map.values(), hasItem(duplicatedIdList.get(4))); }

As can be seen, the goat overwrites the cow with the same id.

Unlike that, Collectors.toMap() and MapUtils.populateMap() throw IllegalStateException and IllegalArgumentException respectively:

@Test(expected = IllegalStateException.class) public void givenADupIdList_whenConvertAfterJava8_thenException() { convertListService.convertListAfterJava8(duplicatedIdList); } @Test(expected = IllegalArgumentException.class) public void givenADupIdList_whenConvertWithGuava_thenException() { convertListService.convertListWithGuava(duplicatedIdList); }

8. Conclusion

Dalam artikel singkat ini, kami telah membahas berbagai cara untuk mengubah Daftar menjadi Peta, memberikan contoh dengan inti Java serta beberapa pustaka pihak ketiga yang populer.

Seperti biasa, kode sumber lengkap tersedia di GitHub.