ฉันคิดว่าไม่จำเป็นต้องอธิบายให้นักเรียน JavaRush ทราบว่าคอลเลกชันคืออะไรและมีไว้เพื่ออะไร อย่างไรก็ตามหลังจากการเปิดตัวเวอร์ชัน 8 การดำเนินการเบื้องต้นหลายอย่างซึ่งก่อนหน้านี้ใช้โค้ด 6-7 บรรทัดก็ถูกทำให้ง่ายขึ้นให้เหลือน้อยที่สุด โดยไม่ต้องกังวลใจอีกต่อไป ต่อไปนี้เป็นเทคนิค Java8 Collections Framework ที่ดีที่สุด 10 อันดับแรกที่จะช่วยคุณประหยัดเวลาและพื้นที่ได้มากมาย!
สวัสดีทุกคนเพื่อน! นิสัยอย่างที่คุณทราบเป็นธรรมชาติที่สอง และเมื่อคุ้นเคยกับการเขียนแล้ว
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
การจะเพิ่มMap
key-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
เป็น — แทนที่ค่าทั้งหมดด้วยผลลัพธ์ของการทำงานของฟังก์ชัน ตัวอย่างเช่น: oldValue
Map.replaceAll(BiFunction<? super K, ? super V, ? extends V> function)
value
function
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: Крутой писатель
เปลี่ยนค่าของทั้งแผนที่ได้อย่างง่ายดายโดยไม่ต้องมีโครงสร้างที่ซับซ้อน! ป.ล. การทำความคุ้นเคยกับสิ่งใหม่ ๆ นั้นยากเสมอ แต่การเปลี่ยนแปลงเหล่านี้เป็นสิ่งที่ดีจริงๆ ไม่ว่าในกรณีใดโค้ดของฉันบางส่วนตอนนี้ก็เหมือนสปาเก็ตตี้น้อยลงกว่าเดิมอย่างแน่นอน :) หากคุณชอบบทความนี้และต้องการดูบทความใหม่ - อย่าลืมสนับสนุนผู้เขียนในการแข่งขันด้วยการคลิก "ถูกใจ" หรือ ยังดีกว่า "ถูกใจ" :) ขอให้โชคดีกับการเรียนของคุณ!
GO TO FULL VERSION