JavaRush /จาวาบล็อก /Random-TH /หยุดเขียนวงจร! 10 วิธีที่ดีที่สุดในการทำงานกับคอลเลกชันจา...
Джон Дориан
ระดับ

หยุดเขียนวงจร! 10 วิธีที่ดีที่สุดในการทำงานกับคอลเลกชันจาก Java 8

เผยแพร่ในกลุ่ม
ฉันคิดว่าไม่จำเป็นต้องอธิบายให้นักเรียน JavaRush ทราบว่าคอลเลกชันคืออะไรและมีไว้เพื่ออะไร อย่างไรก็ตามหลังจากการเปิดตัวเวอร์ชัน 8 การดำเนินการเบื้องต้นหลายอย่างซึ่งก่อนหน้านี้ใช้โค้ด 6-7 บรรทัดก็ถูกทำให้ง่ายขึ้นให้เหลือน้อยที่สุด โดยไม่ต้องกังวลใจอีกต่อไป ต่อไปนี้เป็นเทคนิค Java8 Collections Framework ที่ดีที่สุด 10 อันดับแรกที่จะช่วยคุณประหยัดเวลาและพื้นที่ได้มากมาย! หยุดเขียนวงจร!  10 วิธีที่ดีที่สุดในการทำงานกับคอลเลกชันจาก Java 8 - 1สวัสดีทุกคนเพื่อน! นิสัยอย่างที่คุณทราบเป็นธรรมชาติที่สอง และเมื่อคุ้นเคยกับการเขียนแล้วfor (int i = 0; i <......)ฉันก็ไม่อยากเรียนรู้มันอีกเลย (โดยเฉพาะอย่างยิ่งเมื่อการออกแบบนี้ค่อนข้างเรียบง่ายและเข้าใจได้) อย่างไรก็ตาม ลูปภายในเรามักจะทำซ้ำการดำเนินการเบื้องต้นแบบเดียวกัน ซึ่งเป็นการซ้ำซ้อนที่เราอยากจะกำจัดออกไปจริงๆ ด้วยการเปิดตัว Java8 ทาง Oracle จึงตัดสินใจช่วยเราในเรื่องนี้ ด้านล่างนี้เป็นวิธีการรวบรวมที่ดีที่สุด 10 วิธีซึ่งจะช่วยคุณประหยัดเวลาและรหัสได้มากมาย

1. Iterable.forEach (การกระทำของผู้บริโภค<? super T>)

ชื่อพูดเพื่อตัวเอง วนซ้ำคอลเลกชันที่ส่งผ่านและดำเนินการนิพจน์แลมบ์ดาactionสำหรับแต่ละองค์ประกอบ
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 (ตัวกรองภาคแสดง <? super E>)

ไม่มีอะไรซับซ้อนเช่นกัน วิธีการวนซ้ำผ่านคอลเลกชันและลบองค์ประกอบที่ตรง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 + " "));
ในบรรทัดเดียว เราจะลบตัวเลขทั้งหมดที่มากกว่า 5 ออกจากรายการ

3. Map.forEach(BiConsumer<? super K, ? super V> การกระทำ)

วิธีการนี้forEachใช้ได้ผลไม่เพียงแต่กับคลาสที่ใช้อินเทอร์เฟซCollectionเท่านั้น แต่ยังใช้ได้กับMap.
Map <String, String> books = new HashMap<>();
books.put("Война и мир", "Лев Толстой");
books.put("Преступление и наказание", "Федор Достоевский");
books.put("Философия Java", "Брюс Эккель");
books.put("Братья Карамазовы", "Федор Достоевский");
books.put("Властелин Колец", "Джон Толкин");
books.forEach((a,b) -> System.out.println("Название книги: " + a + ". Author: " + b));
Название книги: Братья Карамазовы. Author: Федор Достоевский
Название книги: Философия Java. Author: Брюс Эккель
Название книги: Преступление и наказание. Author: Федор Достоевский
Название книги: Война и мир. Author: Лев Толстой
Название книги: Властелин Колец. Author: Джон Толкин

4. Map.compute (คีย์ K, BiFunction<? super K, ? super V, ? ขยาย V> remappingFunction)

มันดูน่ากลัวกว่านิดหน่อย แต่ในความเป็นจริงแล้วมันเรียบง่ายเหมือนกับครั้งก่อนๆ สำหรับคีย์ที่ระบุ วิธีการนี้จะตั้งค่าเป็น ผลลัพธ์keyของฟังก์ชัน remappingFunctionตัวอย่างเช่น:
Map <String, String> books = new HashMap<>();
books.put("Война и мир", "Лев Толстой");
books.put("Преступление и наказание", "Федор Достоевский");
books.put("Философия Java", "Брюс Эккель");
books.put("Братья Карамазовы", "Федор Достоевский");
books.put("Властелин Колец", "Джон Толкин");
books.forEach((a,b) -> System.out.println("Название книги: " + a + ". Author: " + b));

books.compute("Философия Java", (a,b) -> b+", крутой чувак");
System.out.println("_______________________");
books.forEach((a,b) -> System.out.println("Название книги: " + a + ". Author: " + b));
Название книги: Братья Карамазовы. Author: Федор Достоевский
Название книги: Философия Java. Author: Брюс Эккель
Название книги: Преступление и наказание. Author: Федор Достоевский
Название книги: Война и мир. Author: Лев Толстой
Название книги: Властелин Колец. Author: Джон Толкин
_______________________
Название книги: Братья Карамазовы. Author: Федор Достоевский
Название книги: Философия Java. Author: Брюс Эккель, крутой чувак
Название книги: Преступление и наказание. Author: Федор Достоевский
Название книги: Война и мир. Author: Лев Толстой
Название книги: Властелин Колец. Author: Джон Толкин
คนเขียน " Java Philosophy " เจ๋งแน่นอน! :)

5. Map.computeIfAbsent (คีย์ K, ฟังก์ชั่น<? super K, ? ขยาย V> mappingFunction)

วิธีการจะเพิ่มองค์ประกอบใหม่ให้กับMapแต่เฉพาะในกรณีที่ไม่มีองค์ประกอบที่มีคีย์เดียวกัน ผลลัพธ์valueของการดำเนินการฟังก์ชันจะถูกกำหนดให้กับmappingFunctionมัน หากมีองค์ประกอบที่มีคีย์ดังกล่าวอยู่แล้ว องค์ประกอบนั้นจะไม่ถูกเขียนทับ แต่จะยังคงอยู่ที่เดิม กลับไปที่หนังสือของเราแล้วลองวิธีการใหม่:
Map <String, String> books = new HashMap<>();
books.put("Война и мир", "Лев Толстой");
books.put("Преступление и наказание", "Федор Достоевский");
books.put("Философия Java", "Брюс Эккель");
books.put("Братья Карамазовы", "Федор Достоевский");
books.put("Властелин Колец", "Джон Толкин");

books.computeIfAbsent("Гарри Поттер и узник Азкабана", b -> getHarryPotterAuthor());
books.forEach((a,b) -> System.out.println("Название книги: " + a + ". Author: " + b));
ฟังก์ชั่นของเราmappingFunction:
public static String getHarryPotterAuthor() {
        return "Джоан Роулинг";
    }
และนี่คือหนังสือเล่มใหม่:
Название книги: Братья Карамазовы. Author: Федор Достоевский
Название книги: Философия Java. Author: Брюс Эккель
Название книги: Преступление и наказание. Author: Федор Достоевский
Название книги: Война и мир. Author: Лев Толстой
Название книги: Гарри Поттер и узник Азкабана. Author: Джоан Роулинг
Название книги: Властелин Колец. Author: Джон Толкин

6. Map.computeIfPresent (คีย์ K, BiFunction<? super K, ? super V, ? ขยาย V> remappingFunction)

หลักการเดียวกันกับMap.compute()แต่การคำนวณทั้งหมดจะดำเนินการก็ต่อเมื่อมีองค์ประกอบที่มีคีย์keyอยู่แล้ว
Map <String, String> books = new HashMap<>();
books.put("Война и мир", "Лев Толстой");
books.put("Преступление и наказание", "Федор Достоевский");
books.put("Философия Java", "Брюс Эккель");
books.put("Братья Карамазовы", "Федор Достоевский");
books.put("Властелин Колец", "Джон Толкин");

books.computeIfPresent("Евгений Онегин", (a,b) -> b="Александр Пушкин");
System.out.println("_________________");
books.forEach((a,b) -> System.out.println("Название книги: " + a + ". Author: " + b));
books.computeIfPresent("Братья Карамазовы", (a,b) -> b="Александр Пушкин");
System.out.println("_________________");
books.forEach((a,b) -> System.out.println("Название книги: " + a + ". Author: " + b));
เมื่อเรียกใช้ฟังก์ชันเป็นครั้งแรก ไม่มีการเปลี่ยนแปลงเกิดขึ้น เนื่องจากMapไม่มีหนังสือชื่อ "Eugene Onegin" อยู่ในของเรา แต่เป็นครั้งที่สองที่โปรแกรมเปลี่ยนผู้แต่งหนังสือ "The Brothers Karamazov" เป็น "Alexander Pushkin" บทสรุป:
_________________
Название книги: Братья Карамазовы. Author: Федор Достоевский
Название книги: Философия Java. Author: Брюс Эккель
Название книги: Преступление и наказание. Author: Федор Достоевский
Название книги: Война и мир. Author: Лев Толстой
Название книги: Властелин Колец. Author: Джон Толкин
_________________
Название книги: Братья Карамазовы. Author: Александр Пушкин
Название книги: Философия Java. Author: Брюс Эккель
Название книги: Преступление и наказание. Author: Федор Достоевский
Название книги: Война и мир. Author: Лев Толстой
Название книги: Властелин Колец. Author: Джон Толкин

7. Map.getOrDefault(คีย์วัตถุ, V defaultValue)

ส่งคืนค่าที่สอดคล้องกับkeyคีย์ หากไม่มีคีย์ดังกล่าว ให้ส่งคืนค่าเริ่มต้น
Map <String, String> books = new HashMap<>();
books.put("Война и мир", "Лев Толстой");
books.put("Преступление и наказание", "Федор Достоевский");
books.put("Философия Java", "Брюс Эккель");
books.put("Братья Карамазовы", "Федор Достоевский");
books.put("Властелин Колец", "Джон Толкин");

String igor = books.getOrDefault("Слово о полку Игореве", "Неизвестный автор");
System.out.println(igor);
สบายมาก:
Неизвестный автор

8. Map.merge (คีย์ K, ค่า V, BiFunction<? super V, ? super V, ? ขยาย V> remappingFunction)

ฉันไม่ได้พยายามคำนวณว่าวิธีนี้จะช่วยคุณประหยัดได้กี่บรรทัด
  • Mapถ้า คีย์keyไม่มีอยู่ในของคุณ หรือ valueสำหรับคีย์นี้ มีค่าเท่ากันวิธีnullการจะเพิ่มMapkey-value
  • หากมีคีย์Keyอยู่และเป็นอยู่value != nullวิธีการจะเปลี่ยนvalueเป็นผลลัพธ์ของการดำเนินการฟังก์ชันที่ส่งremappingFunctionผ่าน
  • หากremappingFunctionส่งคืนnullจะkeyถูกลบออกจากคอลเลกชัน
Map <String, String> books = new HashMap<>();
books.put("Война и мир", "Лев Толстой");
books.put("Преступление и наказание", "Федор Достоевский");
books.put("Философия Java", "Брюс Эккель");
books.put("Братья Карамазовы", "Федор Достоевский");
books.put("Властелин Колец", "Джон Толкин");

books.merge("Философия Java", "Брюс Эккель", (a, b) -> b +  " и кто-то там еще");
books.forEach((a,b) -> System.out.println("Название:" + a + ". Author: " + b));
บทสรุป:
Название:Братья Карамазовы. Author: Федор Достоевский
Название:Философия Java. Author: Брюс Эккель и кто-то там еще
Название:Преступление и наказание. Author: Федор Достоевский
Название:Война и мир. Author: Лев Толстой
Название:Властелин Колец. Author: Джон Толкин
*ขอโทษบรูซ*

9. Map.putIfAbsent (คีย์ K, ค่า V)

ก่อนหน้านี้ หากต้องการเพิ่มคู่Mapหากไม่มีอยู่ คุณต้องดำเนินการดังต่อไปนี้:
Map <String, String> map = new HashMap<>();
if (map.get("Властелин Колец") == null)
    map.put("Властелин Колец", "Джон Толкин");
ตอนนี้ทุกอย่างง่ายขึ้นมาก:
Map<String, String> map = new HashMap<>();
map.putIfAbsent("Властелин Колец", "Джон Толкин");

10. Map.replace และ Map.replaceAll()

สุดท้ายในรายการ แต่ไม่ท้ายสุด Map.replace(K key, V newValue— แทนที่ค่าคีย์keyด้วยnewValueถ้ามีคีย์ดังกล่าวอยู่ ถ้าไม่เช่นนั้นก็ไม่มีอะไรเกิดขึ้น Map.replace(K key, V oldValue, V newValue)- ทำสิ่งเดียวกัน แต่เฉพาะในกรณีที่ค่าปัจจุบัน keyเป็น — แทนที่ค่าทั้งหมดด้วยผลลัพธ์ของการทำงานของฟังก์ชัน ตัวอย่างเช่น: oldValueMap.replaceAll(BiFunction<? super K, ? super V, ? extends V> function)valuefunction
Map <String, String> books = new HashMap<>();
books.put("Война и мир", "Лев Толстой");
books.put("Преступление и наказание", "Федор Достоевский");
books.put("Философия Java", "Брюс Эккель");
books.put("Братья Карамазовы", "Федор Достоевский");
books.put("Властелин Колец", "Джон Толкин");

books.replace("Братья Карамазовы", "Брюс Эккель", "Джон Толкин");
books.forEach((a,b) -> System.out.println("Название:" + a + ". Author: " + b));
Название:Братья Карамазовы. Author: Федор Достоевский
Название:Философия Java. Author: Брюс Эккель
Название:Преступление и наказание. Author: Федор Достоевский
Название:Война и мир. Author: Лев Толстой
Название:Властелин Колец. Author: Джон Толкин
ไม่ทำงาน! ค่าปัจจุบันของคีย์ Brothers Karamazov คือ Fyodor Dostoevsky ไม่ใช่ Bruce Eckel ดังนั้นจึงไม่มีอะไรเปลี่ยนแปลง
Map <String, String> books = new HashMap<>();
books.put("Война и мир", "Лев Толстой");
books.put("Преступление и наказание", "Федор Достоевский");
books.put("Философия Java", "Брюс Эккель");
books.put("Братья Карамазовы", "Федор Достоевский");
books.put("Властелин Колец", "Джон Толкин");

books.replaceAll((a,b) -> getCoolWriter());
books.forEach((a,b) -> System.out.println("Название:" + a + ". Author: " + b));
public static String getCoolWriter() {
        return "Крутой писатель";
    }
Название:Братья Карамазовы. Author: Крутой писатель
Название:Философия Java. Author: Крутой писатель
Название:Преступление и наказание. Author: Крутой писатель
Название:Война и мир. Author: Крутой писатель
Название:Властелин Колец. Author: Крутой писатель
เปลี่ยนค่าของทั้งแผนที่ได้อย่างง่ายดายโดยไม่ต้องมีโครงสร้างที่ซับซ้อน! ป.ล. การทำความคุ้นเคยกับสิ่งใหม่ ๆ นั้นยากเสมอ แต่การเปลี่ยนแปลงเหล่านี้เป็นสิ่งที่ดีจริงๆ ไม่ว่าในกรณีใดโค้ดของฉันบางส่วนตอนนี้ก็เหมือนสปาเก็ตตี้น้อยลงกว่าเดิมอย่างแน่นอน :) หากคุณชอบบทความนี้และต้องการดูบทความใหม่ - อย่าลืมสนับสนุนผู้เขียนในการแข่งขันด้วยการคลิก "ถูกใจ" หรือ ยังดีกว่า "ถูกใจ" :) ขอให้โชคดีกับการเรียนของคุณ!
ความคิดเห็น
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION