![Berhenti menulis gelung! 10 amalan terbaik teratas untuk bekerja dengan koleksi di Java 8 - 1]()
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 sepadan
filter
.
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 ini
forEach
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 menetapkan
key
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 pada
Map
, 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 seperti
Map.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 dengan
key
. 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 anda Map
, atau jika value
kekunci untuk ini ialah null
, maka kaedah menambah key-value
pasangan yang diluluskan ke Map
.
- Jika
key
wujud dan value != null
, maka kaedah menukar nilainya kepada hasil pelaksanaan remappingFunction
.
- Jika
remappingFunction
kembali null
, kemudian key
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 pada
Map
, 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)
menggantikan key
nilai dengan newValue
, 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 untuk key
adalah sama dengan oldValue
.
Map.replaceAll(BiFunction<? super K, ? super V, ? extends V> function)
menggantikan setiap satu value
dengan hasil fungsi.
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.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!
GO TO FULL VERSION