1. Gambaran keseluruhan
Menukar Senarai ke Peta adalah tugas biasa. Dalam tutorial ini, kita akan membahas beberapa cara untuk melakukannya.
Kami akan menganggap bahawa setiap elemen dalam Senarai mempunyai pengecam yang akan digunakan sebagai kunci dalam Peta yang dihasilkan .
2. Contoh Struktur Data
Pertama, mari kita model elemen:
public class Animal { private int id; private String name; // constructor/getters/setters }
The id bidang adalah unik, dengan itu kita boleh membuat ia kunci.
Mari mula menukar dengan cara tradisional.
3. Sebelum Jawa 8
Terbukti, kita dapat menukar Daftar ke Peta menggunakan kaedah 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 penukaran:
@Test public void whenConvertBeforeJava8_thenReturnMapWithTheSameElements() { Map map = convertListService .convertListBeforeJava8(list); assertThat( map.values(), containsInAnyOrder(list.toArray())); }
4. Dengan Java 8
Bermula dengan Java 8 kita dapat mengubah Daftar menjadi Peta menggunakan aliran dan Pengumpul :
public Map convertListAfterJava8(List list) { Map map = list.stream() .collect(Collectors.toMap(Animal::getId, animal -> animal)); return map; }
Sekali lagi, mari pastikan penukaran dilakukan dengan betul:
@Test public void whenConvertAfterJava8_thenReturnMapWithTheSameElements() { Map map = convertListService.convertListAfterJava8(list); assertThat( map.values(), containsInAnyOrder(list.toArray())); }
5. Menggunakan Perpustakaan Jambu Batu
Selain Java inti, kami dapat menggunakan perpustakaan pihak ketiga untuk penukaran.
5.1. Konfigurasi Maven
Pertama, kita perlu menambahkan kebergantungan berikut ke pom.xml kita :
com.google.guava guava 23.6.1-jre
Versi terbaru perpustakaan ini selalu terdapat di sini.
5.2. Penukaran Dengan Maps.uniqueIndex ()
Kedua, mari kita gunakan kaedah Maps.uniqueIndex () untuk menukar Senarai menjadi Peta :
public Map convertListWithGuava(List list) { Map map = Maps .uniqueIndex(list, Animal::getId); return map; }
Akhirnya, mari kita uji penukaran:
@Test public void whenConvertWithGuava_thenReturnMapWithTheSameElements() { Map map = convertListService .convertListWithGuava(list); assertThat( map.values(), containsInAnyOrder(list.toArray())); }
6. Menggunakan Perpustakaan Apache Commons
Kita juga boleh melakukan penukaran dengankaedah perpustakaan Apache Commons.
6.1. Konfigurasi Maven
Pertama, mari kita masukkan kebergantungan Maven:
org.apache.commons commons-collections4 4.2
Versi terbaru dari kebergantungan ini terdapat di sini.
6.2. Peta Peta
Kedua, kami akan melakukan penukaran menggunakan MapUtils.populateMap () :
public Map convertListWithApacheCommons2(List list) { Map map = new HashMap(); MapUtils.populateMap(map, list, Animal::getId); return map; }
Akhir sekali, mari pastikan ia berfungsi seperti yang diharapkan:
@Test public void whenConvertWithApacheCommons2_thenReturnMapWithTheSameElements() { Map map = convertListService .convertListWithApacheCommons2(list); assertThat( map.values(), containsInAnyOrder(list.toArray())); }
7. Pertentangan Nilai
Mari kita periksa apa yang berlaku jika medan id tidak unik.
7.1. Senarai of Animals Dengan Penduaan Id s
Pertama, mari kita membuat List of Animal s dengan tidak 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 gambar di atas, lembu dan kambing mempunyai id yang sama .
7.2. Memeriksa Tingkah Laku
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 ringkas ini, kami telah membahas pelbagai cara untuk menukar Senarai ke Peta, memberikan contoh dengan Java inti serta beberapa perpustakaan pihak ketiga yang popular.
Seperti biasa, kod sumber lengkap boleh didapati di GitHub.