Seperti yang anda tahu, tabiat kita adalah sifat kedua. Dan sebaik sahaja anda membiasakan diri dengan menulis
for (int i = 0; i <......)
, tiada sebahagian daripada anda yang perlu mempelajari semula konstruk ini (terutamanya kerana ia agak mudah dan boleh difahami). Walau bagaimanapun, gelung sering berulang kali digunakan untuk melakukan operasi asas yang sama, dan pengulangan adalah sesuatu yang kami sangat ingin singkirkan. Dengan Java 8, Oracle telah memutuskan untuk membantu kami melakukan ini. Di bawah ialah 10 kaedah pengumpulan terbaik yang akan menjimatkan banyak masa dan kod anda.
1. Iterable.forEach(tindakan <? Super T> Pengguna)
Nama bercakap untuk dirinya sendiri. Ia mengulangi koleksi yang diluluskan sebagai hujah dan melaksanakan ungkapan lambda tindakan untuk setiap elemennya.List <Integer> numbers = new ArrayList<>(Arrays.asList(1,2,3,4,5,6,7));
numbers.forEach(s -> System.out.print(s + " "));
1 2 3 4 5 6 7
2. Collection.removeIf(Predicate<? super E> filter)
Sekali lagi, tiada yang sukar di sini. Kaedah ini berulang pada koleksi dan mengalih keluar sebarang elemen yang sepadanfilter
.
List <Integer> numbers = new ArrayList<>(Arrays.asList(1,2,3,4,5,6,7));
numbers.removeIf(s -> s > 5);
numbers.forEach(s -> System.out.print(s + " "));
Dalam satu baris, kami akan mengalih keluar daripada senarai semua nombor yang lebih besar daripada 5.
3. Map.forEach(BiConsumer <? super K, ? super V> tindakan)
Kaedah iniforEach
berfungsi bukan sahaja untuk kelas yang melaksanakan Collection
antara muka, tetapi juga untuk Map
.
Map <String, String> books = new HashMap<>();
books.put("War and Peace", "Leo Tolstoy");
books.put("Crime and Punishment", "Fyodor Dostoevsky");
books.put("Thinking in Java", "Bruce Eckel");
books.put("The Brothers Karamazov", "Fyodor Dostoevsky");
books.put("The Lord of the Rings", "John Tolkien");
books.forEach((a,b) -> System.out.println("Book title: " + a + ". Author: "+ b));
Book title: The Brothers Karamazov. Author: Fyodor Dostoevsky
Book title: Thinking in Java. Author: Bruce Eckel
Book title: Crime and Punishment. Author: Fyodor Dostoevsky
Book title: War and Peace. Author: Leo Tolstoy
Book title: Lord of the Rings. Author: John Tolkien
4. Map.compute (Kunci K, BiFunction<? Super K,? Super V,? Memanjangkan V> remappingFunction)
Kelihatan sedikit lebih menakutkan, tetapi sebenarnya mudah, seperti semua yang sebelumnya. Kaedah ini menetapkankey
nilai yang sama dengan hasil pelaksanaan mappingFunction
. Sebagai contoh:
Map <String, String> books = new HashMap<>();
books.put("War and Peace", "Leo Tolstoy");
books.put("Crime and Punishment", "Fyodor Dostoevsky");
books.put("Thinking in Java", "Bruce Eckel");
books.put("The Brothers Karamazov", "Fyodor Dostoevsky");
books.put("The Lord of the Rings", "John Tolkien");
books.forEach((a,b) -> System.out.println("Book title: " + a + ". Author: "+ b));
books.compute("Thinking in Java", (a,b) -> b + ", cool dude");
System.out.println("_______________________");
books.forEach((a,b) -> System.out.println("Book title: " + a + ". Author: "+ b));
Book title: The Brothers Karamazov. Author: Fyodor Dostoevsky
Book title: Thinking in Java. Author: Bruce Eckel
Book title: Crime and Punishment. Author: Fyodor Dostoevsky
Book title: War and Peace. Author: Leo Tolstoy
Book title: Lord of the Rings. Author: John Tolkien
_______________________
Book title: The Brothers Karamazov. Author: Fyodor Dostoevsky
Book title: Thinking in Java. Author: Bruce Eckel, cool dude
Book title: Crime and Punishment. Author: Fyodor Dostoevsky
Book title: War and Peace. Author: Leo Tolstoy
Book title: Lord of the Rings. Author: John Tolkien
Pengarang "Thinking in Java" pastinya keren! :)
5. Map.computeIfAbsent(kunci K, Fungsi <? super K, ? memanjangkan V> mappingFunction)
Kaedah ini akan menambah elemen baharu padaMap
, tetapi hanya jika ia belum mempunyai elemen dengan kunci itu. Nilai yang diberikan akan menjadi hasil daripada melaksanakan mappingFunction
. Jika elemen dengan kunci sudah wujud, ia tidak akan ditimpa. Ia hanya akan kekal seperti sedia ada. Mari kembali ke buku kami dan cuba kaedah baharu:
Map <String, String> books = new HashMap<>();
books.put("War and Peace", "Leo Tolstoy");
books.put("Crime and Punishment", "Fyodor Dostoevsky");
books.put("Thinking in Java", "Bruce Eckel");
books.put("The Brothers Karamazov", "Fyodor Dostoevsky");
books.put("The Lord of the Rings", "John Tolkien");
books.computeIfAbsent("Harry Potter and the Prisoner of Azkaban", b -> getHarryPotterAuthor());
books.forEach((a,b) -> System.out.println("Book title: " + a + ". Author: "+ b));
Inilah kami mappingFunction
:
public static String getHarryPotterAuthor() {
return "Joanne Rowling";
}
Dan inilah buku baharu:
Book title: The Brothers Karamazov. Author: Fyodor Dostoevsky
Book title: Thinking in Java. Author: Bruce Eckel
Book title: Crime and Punishment. Author: Fyodor Dostoevsky
Book title: War and Peace. Author: Leo Tolstoy
Book title: Harry Potter and the Prisoner of Azkaban. Author: Joanne Rowling
Book title: Lord of the Rings. Author: John Tolkien
6. Map.computeIfPresent(Kunci K, BiFunction<? super K, ? super V, ? memanjangkan V> remappingFunction)
Di sini kita mempunyai prinsip yang sama sepertiMap.compute()
, tetapi pengiraan dilakukan hanya jika item dengan key
sudah wujud.
Map <String, String> books = new HashMap<>();
books.put("War and Peace", "Leo Tolstoy");
books.put("Crime and Punishment", "Fyodor Dostoevsky");
books.put("Thinking in Java", "Bruce Eckel");
books.put("The Brothers Karamazov", "Fyodor Dostoevsky");
books.put("The Lord of the Rings", "John Tolkien");
books.computeIfPresent("Eugene Onegin", (a,b) -> b = "Alexander Pushkin");
System.out.println("_________________");
books.forEach((a,b) -> System.out.println("Book title: " + a + ". Author: "+ b));
books.computeIfPresent("The Brothers Karamazov", (a,b) -> b = "Alexander Pushkin");
System.out.println("_________________");
books.forEach((a,b) -> System.out.println("Book title: " + a + ". Author: "+ b));
Panggilan pertama ke fungsi itu tidak membuat sebarang perubahan, kerana tiada buku bertajuk "Eugene Onegin" dalam Map
. Tetapi dalam panggilan kedua, program itu menukar pengarang buku "The Brothers Karamazov" kepada Alexander Pushkin. Pengeluaran:
_________________
Book title: The Brothers Karamazov. Author: Fyodor Dostoevsky
Book title: Thinking in Java. Author: Bruce Eckel
Book title: Crime and Punishment. Author: Fyodor Dostoevsky
Book title: War and Peace. Author: Leo Tolstoy
Book title: Lord of the Rings. Author: John Tolkien
_________________
Book title: The Brothers Karamazov. Author: Alexander Pushkin
Book title: Thinking in Java. Author: Bruce Eckel
Book title: Crime and Punishment. Author: Fyodor Dostoevsky
Book title: War and Peace. Author: Leo Tolstoy
Book title: Lord of the Rings. Author: John Tolkien
7. Map.getOrDefault(Kunci objek, V defaultValue)
Kaedah ini mengembalikan nilai yang sepadan dengankey
. Jika kunci tidak wujud, maka ia mengembalikan nilai lalai.
Map <String, String> books = new HashMap<>();
books.put("War and Peace", "Leo Tolstoy");
books.put("Crime and Punishment", "Fyodor Dostoevsky");
books.put("Thinking in Java", "Bruce Eckel");
books.put("The Brothers Karamazov", "Fyodor Dostoevsky");
books.put("The Lord of the Rings", "John Tolkien");
String igor = books.getOrDefault("The Tale of Igor's Campaign", "Unknown author");
System.out.println(igor);
Ini sangat mudah:
Unknown author
8. Map.merge(Kunci K, nilai V, BiFunction<? super V, ? super V, ? memanjangkan V> remappingFunction)
Saya tidak peduli untuk mengira berapa banyak baris kod kaedah ini akan menjimatkan anda.- Jika
key
tidak wujud dalam andaMap
, atau jikavalue
kekunci untuk ini ialahnull
, maka kaedah menambahkey-value
pasangan yang diluluskan keMap
. - Jika
key
wujud danvalue != null
, maka kaedah menukar nilainya kepada hasil pelaksanaanremappingFunction
. - Jika
remappingFunction
kembalinull
, kemudiankey
dialih keluar daripada koleksi.
Map <String, String> books = new HashMap<>();
books.put("War and Peace", "Leo Tolstoy");
books.put("Crime and Punishment", "Fyodor Dostoevsky");
books.put("Thinking in Java", "Bruce Eckel");
books.put("The Brothers Karamazov", "Fyodor Dostoevsky");
books.put("The Lord of the Rings", "John Tolkien");
books.merge("Thinking in Java", "Bruce Eckel", (a, b) -> b + " and some coauthor");
books.forEach((a, b) -> System.out.println("Title: " + a + ". Author: "+ b));
Pengeluaran:
Title: The Brothers Karamazov. Author: Fyodor Dostoevsky
Title: Thinking in Java. Author: Bruce Eckel and some coauthor
Title: Crime and Punishment. Author: Fyodor Dostoevsky
Title: War and Peace. Author: Leo Tolstoy
Title: Lord of the Rings. Author: John Tolkien
*maaf, Bruce*
9. Map.putIfAbsent(kunci K, nilai V)
Sebelum ini, untuk menambah pasangan padaMap
, jika ia belum ada, anda perlu melakukan perkara berikut:
Map <String, String> map = new HashMap<>();
if (map.get("Lord of the Rings") == null)
map.put("Lord of the Rings", "John Tolkien");
Kini semuanya menjadi lebih mudah:
Map<String, String> map = new HashMap<>();
map.putIfAbsent("Lord of the Rings", "John Tolkien");
10. Map.replace dan Map.replaceAll()
Last but not least.Map.replace(K key, V newValue)
menggantikankey
nilai dengannewValue
, jika kunci sedemikian wujud. Jika tidak, tiada apa yang berlaku.Map.replace(K key, V oldValue, V newValue)
melakukan perkara yang sama, tetapi hanya jika nilai semasa untukkey
adalah sama denganoldValue
.Map.replaceAll(BiFunction<? super K, ? super V, ? extends V> function)
menggantikan setiap satuvalue
dengan hasil fungsi.
Map <String, String> books = new HashMap<>();
books.put("War and Peace", "Leo Tolstoy");
books.put("Crime and Punishment", "Fyodor Dostoevsky");
books.put("Thinking in Java", "Bruce Eckel");
books.put("The Brothers Karamazov", "Fyodor Dostoevsky");
books.put("The Lord of the Rings", "John Tolkien");
books.replace("The Brothers Karamazov", "Bruce Eckel", "John Tolkien");
books.forEach((a, b) -> System.out.println("Title: " + a + ". Author: "+ b));
Title: The Brothers Karamazov. Author: Fyodor Dostoevsky
Title: Thinking in Java. Author: Bruce Eckel
Title: Crime and Punishment. Author: Fyodor Dostoevsky
Title: War and Peace. Author: Leo Tolstoy
Title: Lord of the Rings. Author: John Tolkien
Ia tidak berjaya! Nilai semasa untuk kunci "The Brothers Karamazov" ialah "Fyodor Dostoevsky", bukan "Bruce Eckel", jadi tiada apa yang berubah.
Map books = new HashMap<>();
books.put("War and Peace", "Leo Tolstoy");
books.put("Crime and Punishment", "Fyodor Dostoevsky");
books.put("Thinking in Java", "Bruce Eckel");
books.put("The Brothers Karamazov", "Fyodor Dostoevsky");
books.put("The Lord of the Rings", "John Tolkien");
books.replaceAll((a,b) -> getCoolAuthor());
books.forEach((a, b) -> System.out.println("Title: " + a + ". Author: "+ b));
public static String getCoolAuthor() {
return "Cool author";
}
Title: The Brothers Karamazov. Author: Cool author
Title: Thinking in Java. Author: Cool author
Title: Crime and Punishment. Author: Cool author
Title: War and Peace. Author: Cool author
Title: Lord of the Rings. Author: Cool author
Kami dengan mudah menukar nilai untuk keseluruhan Map
tanpa sebarang binaan yang rumit! PS Membiasakan diri dengan yang baharu sentiasa sukar, tetapi perubahan ini benar-benar bagus. Walau apa pun, beberapa bahagian kod saya pastinya kurang seperti spageti berbanding sebelum ini :) Semoga berjaya dalam pembelajaran!