Saya baru saja mulai melihat Java 8 dan mencoba lambda saya pikir saya akan mencoba menulis ulang hal yang sangat sederhana yang saya tulis baru-baru ini. Saya perlu mengubah Peta String ke Kolom menjadi Peta String ke Kolom lain di mana Kolom di Peta baru adalah salinan defensif Kolom di Peta pertama. Kolom memiliki konstruktor salinan. Hal terdekat yang saya dapatkan sejauh ini adalah:
Map<String, Column> newColumnMap= new HashMap<>();
originalColumnMap.entrySet().stream().forEach(x -> newColumnMap.put(x.getKey(), new Column(x.getValue())));
tapi saya yakin pasti ada cara yang lebih baik untuk melakukannya dan saya akan berterima kasih atas beberapa nasihat.
Map<String, Integer> map = new HashMap<>(); map.put("test1", 1); map.put("test2", 2); Map<String, Integer> map2 = new HashMap<>(); map.forEach(map2::put); System.out.println("map: " + map); System.out.println("map2: " + map2); // Output: // map: {test2=2, test1=1} // map2: {test2=2, test1=1}
Anda dapat menggunakan
forEach
metode ini untuk melakukan apa yang Anda inginkan.Apa yang Anda lakukan di sana adalah:
map.forEach(new BiConsumer<String, Integer>() { @Override public void accept(String s, Integer integer) { map2.put(s, integer); } });
Yang bisa kita sederhanakan menjadi lambda:
Dan karena kita hanya memanggil metode yang sudah ada, kita bisa menggunakan referensi metode , yang memberi kita:
sumber
originalColumnMap.forEach((string, column) -> newColumnMap.put(string, new Column(column)));
atau dapatkah saya mempersingkatnya?new Column(column)
sebagai paremeter, Anda harus menggunakannya.Cara tanpa memasukkan kembali semua entri ke peta baru harus menjadi yang tercepatkarena secaraHashMap.clone
internal melakukan pengulangan juga.Map<String, Column> newColumnMap = originalColumnMap.clone(); newColumnMap.replaceAll((s, c) -> new Column(c));
sumber
Map<String,Column> newColumnMap = new HashMap<>(originalColumnMap);
. Saya tidak tahu apakah ada bedanya di bawah selimut.Map
perilaku implementasinya, yaitu jikaMap
anEnumMap
atau aSortedMap
, hasilnyaMap
juga akan sama. Dalam kasusSortedMap
dengan khususComparator
itu mungkin membuat perbedaan semantik besar. Oh well, hal yang sama berlaku untukIdentityHashMap
...Buat tetap sederhana dan gunakan Java 8: -
sumber
Jika Anda menggunakan Guava (minimum v11) dalam proyek Anda, Anda dapat menggunakan Maps :: transformValues .
Map<String, Column> newColumnMap = Maps.transformValues( originalColumnMap, Column::new // equivalent to: x -> new Column(x) )
Catatan: Nilai peta ini dievaluasi dengan malas. Jika transformasinya mahal, Anda dapat menyalin hasilnya ke peta baru seperti yang disarankan di dokumen Guava.
To avoid lazy evaluation when the returned map doesn't need to be a view, copy the returned map into a new map of your choosing.
sumber
To avoid lazy evaluation when the returned map doesn't need to be a view, copy the returned map into a new map of your choosing.
Berikut adalah cara lain yang memberi Anda akses ke kunci dan nilai secara bersamaan, jika Anda harus melakukan beberapa jenis transformasi.
Map<String, Integer> pointsByName = new HashMap<>(); Map<String, Integer> maxPointsByName = new HashMap<>(); Map<String, Double> gradesByName = pointsByName.entrySet().stream() .map(entry -> new AbstractMap.SimpleImmutableEntry<>( entry.getKey(), ((double) entry.getValue() / maxPointsByName.get(entry.getKey())) * 100d)) .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
sumber
Jika Anda tidak keberatan menggunakan pustaka pihak ketiga, lib cyclops-react saya memiliki ekstensi untuk semua jenis Koleksi JDK , termasuk Peta . Anda dapat langsung menggunakan metode peta atau bimap untuk mengubah Peta Anda. Sebuah MapX dapat dibangun dari Peta yang ada misalnya.
MapX<String, Column> y = MapX.fromMap(orgColumnMap) .map(c->new Column(c.getValue());
Jika Anda juga ingin mengubah kunci, Anda dapat menulis
MapX<String, Column> y = MapX.fromMap(orgColumnMap) .bimap(this::newKey,c->new Column(c.getValue());
bimap dapat digunakan untuk mengubah kunci dan nilai secara bersamaan.
Saat MapX meluas, Peta yang dihasilkan juga dapat didefinisikan sebagai
sumber