CodeGym /Java Blog /Random /Itigil ang pagsusulat ng mga loop! Nangungunang 10 pinaka...
John Squirrels
Antas
San Francisco

Itigil ang pagsusulat ng mga loop! Nangungunang 10 pinakamahusay na kagawian para sa pagtatrabaho sa mga koleksyon sa Java 8

Nai-publish sa grupo
Itigil ang pagsusulat ng mga loop!  Nangungunang 10 pinakamahusay na kagawian para sa pagtatrabaho sa mga koleksyon sa Java 8 - 1 Tulad ng alam mo, ang ating mga gawi ay pangalawang kalikasan. At kapag nasanay ka na sa pagsusulat for (int i = 0; i <......), walang bahagi sa iyo ang gustong muling pag-aralan ang construct na ito (lalo na dahil ito ay medyo simple at naiintindihan). Gayunpaman, ang mga loop ay madalas na paulit-ulit na ginagamit upang maisagawa ang parehong mga pangunahing operasyon, at ang pag-uulit ay isang bagay na gusto naming alisin. Sa Java 8, nagpasya ang Oracle na tulungan kaming gawin ito. Nasa ibaba ang 10 pinakamahusay na paraan ng koleksyon na makakatipid sa iyo ng isang toneladang oras at code.

1. Iterable.forEach(Consumer <? Super T> action)

Ang pangalan ay nagsasalita para sa sarili nito. Ito ay umuulit sa koleksyon na ipinasa bilang isang argumento, at isinasagawa ang aksyon na lambda expression para sa bawat isa sa mga elemento nito.

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)

Muli, walang mahirap dito. Ang pamamaraan ay umuulit sa koleksyon at nag-aalis ng anumang elementong tumutugma sa 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 + " "));
Sa isang linya, aalisin namin mula sa listahan ang lahat ng numerong higit sa 5.

3. Map.forEach(BiConsumer <? super K, ? super V> action)

Ang forEachpamamaraan ay gumagana hindi lamang para sa mga klase na nagpapatupad ng Collectioninterface, kundi pati na rin para sa 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 (K key, BiFunction<? Super K,? Super V,? Pinapalawak ang V> remappingFunction)

Mukhang mas nakakatakot, ngunit sa katunayan simple, tulad ng lahat ng mga nauna. Ang pamamaraang ito ay nagtatakda keyng halaga na katumbas ng resulta ng pagpapatupad mappingFunction. Halimbawa:

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
Ang may-akda ng "Thinking in Java" ay talagang cool! :)

5. Map.computeIfAbsent(K key, Function <? super K, ? extends V> mappingFunction)

Ang pamamaraang ito ay magdaragdag ng bagong elemento sa Map, ngunit kung wala pa itong elementong may key na iyon. Ang itinalagang halaga ay magiging resulta ng pagpapatupad ng mappingFunction. Kung mayroon nang elementong may susi, hindi ito ma-overwrite. Ito ay mananatili lamang bilang ay. Bumalik tayo sa ating mga aklat at sumubok ng bagong paraan:

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));
Narito ang aming mappingFunction:

public static String getHarryPotterAuthor() {
        return "Joanne Rowling";
    }
At narito ang bagong libro:

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(K key, BiFunction<? super K, ? super V, ? extends V> remappingFunction)

Narito mayroon kaming parehong prinsipyo bilang Map.compute(), ngunit ang mga kalkulasyon ay ginagawa lamang kung ang isang item na keymayroon na.

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));
Ang unang tawag sa function ay walang pagbabago, dahil walang aklat na pinamagatang "Eugene Onegin" sa aming Map. Ngunit sa pangalawang tawag, binago ng programa ang may-akda ng aklat na "The Brothers Karamazov" kay Alexander Pushkin. Output:

_________________
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(Object key, V defaultValue)

Ibinabalik ng pamamaraang ito ang halaga na katumbas ng key. Kung wala ang susi, ibinabalik nito ang default na halaga.

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);
Ito ay napaka-maginhawa:

Unknown author

8. Map.merge(K key, V value, BiFunction<? super V, ? super V, ? extends V> remappingFunction)

Hindi man lang ako nag-abala na subukang kalkulahin kung gaano karaming mga linya ng code ang ililigtas ka ng paraang ito.
  1. Kung keywala sa iyong Map, o kung ang valuepara sa susi na ito ay null, kung gayon ang pamamaraan ay nagdaragdag ng ipinasa key-valuena pares sa Map.
  2. Kung keymayroon at nito value != null, ang pamamaraan ay nagbabago ng halaga nito sa resulta ng pagpapatupad remappingFunction.
  3. Kung remappingFunctionbumalik null, pagkatapos keyay aalisin sa koleksyon.

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));
Output:

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
*sorry, Bruce*

9. Map.putIfAbsent(K key, V value)

Dati, upang magdagdag ng pares sa isang Map, kung wala pa ito, kailangan mong gawin ang sumusunod:

Map <String, String> map = new HashMap<>();
if (map.get("Lord of the Rings") == null)
    map.put("Lord of the Rings", "John Tolkien");
Ngayon ang lahat ay naging mas madali:

Map<String, String> map = new HashMap<>();
map.putIfAbsent("Lord of the Rings", "John Tolkien");

10. Map.replace at Map.replaceAll()

Huli ngunit hindi bababa sa.
  1. Map.replace(K key, V newValue)pinapalitan keyang halaga ng newValue, kung may ganoong susi. Kung hindi, walang mangyayari.
  2. Map.replace(K key, V oldValue, V newValue)ginagawa ang parehong bagay, ngunit kung ang kasalukuyang halaga para sa keyay katumbas ng oldValue.
  3. Map.replaceAll(BiFunction<? super K, ? super V, ? extends V> function)pinapalitan ang bawat isa valueng resulta ng pag-andar.
Halimbawa:

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
Hindi ito gumana! Ang kasalukuyang halaga para sa susi na "The Brothers Karamazov" ay "Fyodor Dostoevsky", hindi "Bruce Eckel", kaya walang nagbago.

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
Madali naming binago ang mga halaga para sa kabuuan Mapnang walang anumang kumplikadong mga konstruksyon! PS Ang masanay sa bago ay palaging mahirap, ngunit ang mga pagbabagong ito ay talagang maganda. Sa anumang kaganapan, ang ilang bahagi ng aking code ay tiyak na hindi katulad ng spaghetti kaysa dati :) Good luck sa pag-aaral!
Mga komento
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION