CodeGym/Blog Java/rawak/Berhenti menulis gelung! 10 amalan terbaik teratas untuk ...
John Squirrels
Tahap
San Francisco

Berhenti menulis gelung! 10 amalan terbaik teratas untuk bekerja dengan koleksi di Java 8

Diterbitkan dalam kumpulan
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 forEachberfungsi bukan sahaja untuk kelas yang melaksanakan Collectionantara 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 keynilai 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 keysudah 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.
  1. Jika keytidak wujud dalam anda Map, atau jika valuekekunci untuk ini ialah null, maka kaedah menambah key-valuepasangan yang diluluskan ke Map.
  2. Jika keywujud dan value != null, maka kaedah menukar nilainya kepada hasil pelaksanaan remappingFunction.
  3. Jika remappingFunctionkembali null, kemudian keydialih 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.
  1. Map.replace(K key, V newValue)menggantikan keynilai dengan newValue, jika kunci sedemikian wujud. Jika tidak, tiada apa yang berlaku.
  2. Map.replace(K key, V oldValue, V newValue)melakukan perkara yang sama, tetapi hanya jika nilai semasa untuk keyadalah sama dengan oldValue.
  3. Map.replaceAll(BiFunction<? super K, ? super V, ? extends V> function)menggantikan setiap satu valuedengan 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 Maptanpa 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!
Komen
  • Popular
  • Baru
  • Tua
Anda mesti log masuk untuk meninggalkan ulasan
Halaman ini tidak mempunyai sebarang ulasan lagi