Cara Menukar Senarai ke Peta di Jawa

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.