Apache Commons Collections MapUtils

Artikel ini adalah bagian dari serial: • Apache Commons Collections Bag

• Apache Commons Collections SetUtils

• Apache Commons Collections OrderedMap

• Apache Commons Collections BidiMap

• Panduan untuk Apache Commons Collections CollectionUtils

• Apache Commons Collections MapUtils (artikel saat ini) • Panduan untuk Apache Commons CircularFifoQueue

1. Perkenalan

MapUtils adalah salah satu alat yang tersedia di proyek Koleksi Apache Commons.

Sederhananya, ia menyediakan metode utilitas dan dekorator bekerja dengan java.util.Map dan java.util.SortedMap contoh.

2. Penyiapan

Mari kita mulai dengan menambahkan ketergantungan:

 org.apache.commons commons-collections4 4.1 

3. Metode Utilitas

3.1. Membuat Peta dari Array

Sekarang, mari kita siapkan array yang akan kita gunakan untuk membuat peta:

public class MapUtilsTest { private String[][] color2DArray = new String[][] { {"RED", "#FF0000"}, {"GREEN", "#00FF00"}, {"BLUE", "#0000FF"} }; private String[] color1DArray = new String[] { "RED", "#FF0000", "GREEN", "#00FF00", "BLUE", "#0000FF" }; private Map colorMap; //... }

Mari kita lihat bagaimana kita bisa membuat peta dari array dua dimensi:

@Test public void whenCreateMapFrom2DArray_theMapIsCreated() { this.colorMap = MapUtils.putAll( new HashMap(), this.color2DArray); assertThat( this.colorMap, is(aMapWithSize(this.color2DArray.length))); assertThat(this.colorMap, hasEntry("RED", "#FF0000")); assertThat(this.colorMap, hasEntry("GREEN", "#00FF00")); assertThat(this.colorMap, hasEntry("BLUE", "#0000FF")); }

Kita juga bisa menggunakan array satu dimensi. Dalam hal ini, array diperlakukan sebagai kunci dan nilai dalam indeks alternatif:

@Test public void whenCreateMapFrom1DArray_theMapIsCreated() { this.colorMap = MapUtils.putAll( new HashMap(), this.color1DArray); assertThat( this.colorMap, is(aMapWithSize(this.color1DArray.length / 2))); assertThat(this.colorMap, hasEntry("RED", "#FF0000")); assertThat(this.colorMap, hasEntry("GREEN", "#00FF00")); assertThat(this.colorMap, hasEntry("BLUE", "#0000FF")); }

3.2. Mencetak Isi Peta

Seringkali saat men-debug atau dalam log debug, kami ingin mencetak seluruh peta:

@Test public void whenVerbosePrintMap_thenMustPrintFormattedMap() { MapUtils.verbosePrint(System.out, "Optional Label", this.colorMap); }

Dan hasilnya:

Optional Label = { RED = #FF0000 BLUE = #0000FF GREEN = #00FF00 }

Kita juga bisa menggunakan debugPrint () yang mencetak tipe data nilai tambahan.

3.3. Mendapatkan Nilai

MapUtils menyediakan beberapa metode untuk mengekstrak nilai dari peta untuk kunci tertentu dengan cara aman- null .

Misalnya, getString () mendapatkan String dari Peta . Nilai String diperoleh melalui toString () . Secara opsional, kami dapat menentukan nilai default yang akan dikembalikan jika nilainya nol atau jika konversi gagal:

@Test public void whenGetKeyNotPresent_thenMustReturnDefaultValue() { String defaultColorStr = "COLOR_NOT_FOUND"; String color = MapUtils .getString(this.colorMap, "BLACK", defaultColorStr); assertEquals(color, defaultColorStr); }

Perhatikan bahwa metode ini null -safe, yaitu metode ini dapat menangani parameter peta null dengan aman :

@Test public void whenGetOnNullMap_thenMustReturnDefaultValue() { String defaultColorStr = "COLOR_NOT_FOUND"; String color = MapUtils.getString(null, "RED", defaultColorStr); assertEquals(color, defaultColorStr); }

Di sini warna akan mendapatkan nilai COLOR_NOT_FOUND meskipun petanya null .

3.4. Membalik Peta

Kami juga dapat dengan mudah membalikkan peta:

@Test public void whenInvertMap_thenMustReturnInvertedMap() { Map invColorMap = MapUtils.invertMap(this.colorMap); int size = invColorMap.size(); Assertions.assertThat(invColorMap) .hasSameSizeAs(colorMap) .containsKeys(this.colorMap.values().toArray(new String[] {})) .containsValues(this.colorMap.keySet().toArray(new String[] {})); }

Ini akan membalikkan colorMap menjadi :

{ #00FF00 = GREEN #FF0000 = RED #0000FF = BLUE }

Jika peta sumber mengaitkan nilai yang sama untuk beberapa kunci maka setelah pembalikan salah satu nilai akan menjadi kunci secara acak.

3.5. Cek Null dan Empty

isEmpty () metode kembali benar jika Peta adalah nol atau kosong.

safeAddToMap () metode mencegah penambahan elemen null ke Peta.

4. Dekorator

Metode ini menambahkan fungsionalitas tambahan ke Peta.

Dalam kebanyakan kasus, praktik yang baik adalah tidak menyimpan referensi ke Peta yang dihias .

4.1. Peta Ukuran Tetap

fixedSizeMap () mengembalikan peta ukuran tetap yang didukung oleh peta yang diberikan. Elemen dapat diubah tetapi tidak ditambahkan atau dihapus:

@Test(expected = IllegalArgumentException.class) public void whenCreateFixedSizedMapAndAdd_thenMustThrowException() { Map rgbMap = MapUtils .fixedSizeMap(MapUtils.putAll(new HashMap(), this.color1DArray)); rgbMap.put("ORANGE", "#FFA500"); }

4.2. Peta Prediksi

Metode predicatedMap () mengembalikan Map memastikan bahwa semua elemen yang dipegang cocok dengan predikat yang diberikan:

@Test(expected = IllegalArgumentException.class) public void whenAddDuplicate_thenThrowException() { Map uniqValuesMap = MapUtils.predicatedMap(this.colorMap, null, PredicateUtils.uniquePredicate()); uniqValuesMap.put("NEW_RED", "#FF0000"); }

Di sini, kami menetapkan predikat untuk nilai menggunakan PredicateUtils.uniquePredicate () . Setiap upaya untuk memasukkan nilai duplikat ke dalam peta ini akan menghasilkan java.lang. IllegalArgumentException .

Kita dapat mengimplementasikan predikat khusus dengan mengimplementasikan antarmuka Predicate .

4.3. Peta Malas

lazyMap () mengembalikan peta tempat nilai diinisialisasi saat diminta.

Jika kunci yang diteruskan ke metode Map.get (Object) peta ini tidak ada di peta, instance Transformer akan digunakan untuk membuat objek baru yang akan dikaitkan dengan kunci yang diminta:

@Test public void whenCreateLazyMap_theMapIsCreated() { Map intStrMap = MapUtils.lazyMap( new HashMap(), TransformerUtils.stringValueTransformer()); assertThat(intStrMap, is(anEmptyMap())); intStrMap.get(1); intStrMap.get(2); intStrMap.get(3); assertThat(intStrMap, is(aMapWithSize(3))); }

5. Kesimpulan

Dalam tutorial singkat ini, kami telah menjelajahi kelas Apache Commons Collections MapUtils dan kami melihat berbagai metode utilitas dan dekorator yang dapat menyederhanakan berbagai operasi peta umum.

Seperti biasa, kode tersedia di GitHub.

Berikutnya » Panduan untuk Apache Commons CircularFifoQueue « Sebelumnya Panduan untuk Koleksi Koleksi Apache Commons