JavaRush /Blog Java /Random-VI /Dừng viết chu kỳ! Top 10 phương pháp tốt nhất để làm việc...

Dừng viết chu kỳ! Top 10 phương pháp tốt nhất để làm việc với các bộ sưu tập từ Java 8

Xuất bản trong nhóm
Tôi nghĩ không cần thiết phải giải thích cho sinh viên JavaRush các bộ sưu tập là gì và chúng dùng để làm gì. Tuy nhiên, sau khi phát hành phiên bản thứ 8, nhiều thao tác cơ bản trước đây phải mất 6-7 dòng mã đã được đơn giản hóa đến mức tối thiểu. Không cần phải dài dòng nữa, đây là 10 kỹ thuật Khung bộ sưu tập Java8 tốt nhất sẽ giúp bạn tiết kiệm rất nhiều thời gian và không gian! Dừng viết chu kỳ!  Top 10 phương pháp tốt nhất để làm việc với các bộ sưu tập từ Java 8 - 1Xin chào tất cả mọi người, các bạn! Thói quen, như bạn biết, là bản chất thứ hai. Và đã quen viết rồi nên for (int i = 0; i <......)tôi không muốn học lại chút nào (đặc biệt vì thiết kế này khá đơn giản và dễ hiểu). Tuy nhiên, bên trong các vòng lặp, chúng ta thường lặp lại các thao tác cơ bản giống nhau, sự lặp lại mà chúng ta thực sự muốn loại bỏ. Với việc phát hành Java8, Oracle đã quyết định giúp chúng tôi thực hiện việc này. Dưới đây là 10 phương pháp thu thập tốt nhất sẽ giúp bạn tiết kiệm rất nhiều thời gian và mã.

1. Iterable.forEach(Hành động của người tiêu dùng<? super T>)

Tên nói cho chính nó. Lặp lại bộ sưu tập đã truyền và thực thi biểu thức lambda actioncho từng phần tử.
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(Bộ lọc Vị ngữ<? super E>)

Cũng không có gì phức tạp cả. Phương thức này lặp qua bộ sưu tập và loại bỏ những phần tử khớp với 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 + " "));
Trong một dòng, chúng tôi xóa khỏi danh sách tất cả các số lớn hơn 5.

3. Map.forEach(hành động BiConsumer<? super K, ? super V>)

Phương thức này forEachhoạt động không chỉ đối với các lớp triển khai giao diện Collectionmà còn đối với các lớp 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 phím,BiFunction<? super K, ? super V, ? mở rộng V> remappingFunction)

Nó trông đáng sợ hơn một chút, nhưng trên thực tế nó rất đơn giản, giống như tất cả những cái trước. Đối với khóa được chỉ định key, phương thức này đặt giá trị cho kết quả của hàm remappingFunction. Ví dụ:
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: Джон Толкин
Tác giả của " Triết học Java " chắc chắn rất tuyệt! :)

5. Map.computeIfAbsent(Phím K, Hàm<? super K, ? mở rộng V> mapsFunction)

Phương thức này sẽ thêm một phần tử mới vào Map , nhưng chỉ khi phần tử có cùng khóa không có ở đó. Kết quả valuethực hiện hàm sẽ được gán cho nó mappingFunction. Nếu một phần tử có khóa như vậy đã tồn tại, nó sẽ không bị ghi đè mà vẫn giữ nguyên. Hãy quay lại cuốn sách của chúng tôi và thử một phương pháp mới:
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));
Chức năng của chúng tôi mappingFunction:
public static String getHarryPotterAuthor() {
        return "Джоан Роулинг";
    }
Và đây là cuốn sách mới:
Название книги: Братья Карамазовы. Author: Федор Достоевский
Название книги: Философия Java. Author: Брюс Эккель
Название книги: Преступление и наказание. Author: Федор Достоевский
Название книги: Война и мир. Author: Лев Толстой
Название книги: Гарри Поттер и узник Азкабана. Author: Джоан Роулинг
Название книги: Властелин Колец. Author: Джон Толкин

6. Map.computeIfPresent(K phím, BiFunction<? super K, ? super V, ? mở rộng V> remappingFunction)

Nguyên tắc tương tự như , Map.compute()nhưng tất cả các phép tính sẽ chỉ được thực hiện nếu phần tử có khóa keyđã tồn tại.
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));
Khi hàm này được gọi lần đầu tiên, không có thay đổi nào xảy ra vì Mapkhông có cuốn sách nào có tựa đề “Eugene Onegin” trong cuốn sách của chúng tôi. Nhưng lần thứ hai chương trình đã thay đổi tác giả của cuốn sách “Anh em nhà Karamazov” thành “Alexander Pushkin”. Phần kết luận:
_________________
Название книги: Братья Карамазовы. Author: Федор Достоевский
Название книги: Философия Java. Author: Брюс Эккель
Название книги: Преступление и наказание. Author: Федор Достоевский
Название книги: Война и мир. Author: Лев Толстой
Название книги: Властелин Колец. Author: Джон Толкин
_________________
Название книги: Братья Карамазовы. Author: Александр Пушкин
Название книги: Философия Java. Author: Брюс Эккель
Название книги: Преступление и наказание. Author: Федор Достоевский
Название книги: Война и мир. Author: Лев Толстой
Название книги: Властелин Колец. Author: Джон Толкин

7. Map.getOrDefault(Khóa đối tượng, V defaultValue)

Trả về giá trị tương ứng với key key. Nếu khóa đó không tồn tại, trả về giá trị mặc định.
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);
Rất thoải mái:
Неизвестный автор

8. Map.merge (Khóa K, giá trị V, BiFunction<? super V, ? super V, ? mở rộng V> remappingFunction)

Tôi thậm chí còn không thử tính xem phương pháp này sẽ giúp bạn tiết kiệm được bao nhiêu dòng mã.
  • MapNếu khóa keykhông tồn tại trong khóa của bạn hoặc valueđối với khóa này nó bằng nhau thì nullphương thức sẽ thêm vào .Mapkey-value
  • Nếu khóa Keytồn tại và nó ở đó, value != nullphương thức sẽ thay đổi nó valuethành kết quả của việc thực thi hàm đã truyền remappingFunction.
  • Nếu remappingFunctionnó trả về null, keynó sẽ bị xóa khỏi bộ sưu tập.
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));
Phần kết luận:
Название:Братья Карамазовы. Author: Федор Достоевский
Название:Философия Java. Author: Брюс Эккель и кто-то там еще
Название:Преступление и наказание. Author: Федор Достоевский
Название:Война и мир. Author: Лев Толстой
Название:Властелин Колец. Author: Джон Толкин
*xin lỗi Bruce*

9. Map.putIfAbsent(Khóa K, giá trị V)

Trước đây, để thêm một cặp vào Mapnếu nó không có ở đó, bạn phải làm như sau:
Map <String, String> map = new HashMap<>();
if (map.get("Властелин Колец") == null)
    map.put("Властелин Колец", "Джон Толкин");
Bây giờ mọi thứ đã trở nên đơn giản hơn nhiều:
Map<String, String> map = new HashMap<>();
map.putIfAbsent("Властелин Колец", "Джон Толкин");

10. Map.replace và Map.replaceAll()

Cuối cùng trong danh sách, nhưng không kém phần quan trọng. Map.replace(K key, V newValue— thay thế giá trị khóa keybằng newValue, nếu khóa đó tồn tại. Nếu không, không có gì xảy ra. Map.replace(K key, V oldValue, V newValue)- thực hiện tương tự, nhưng chỉ khi giá trị hiện tại keyoldValue. Map.replaceAll(BiFunction<? super K, ? super V, ? extends V> function)— thay thế tất cả các giá trị valuebằng kết quả thực thi hàm function. Ví dụ:
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: Джон Толкин
Đã không làm việc! Giá trị hiện tại của chìa khóa Brothers Karamazov là Fyodor Dostoevsky chứ không phải Bruce Eckel nên không có gì thay đổi.
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: Крутой писатель
Dễ dàng thay đổi các giá trị cho toàn bộ Bản đồ mà không cần bất kỳ cấu trúc phức tạp nào! Tái bút Làm quen với một cái gì đó mới luôn khó khăn, nhưng những thay đổi này thực sự tốt. Trong mọi trường hợp, một số phần trong mã của tôi giờ đây chắc chắn ít giống spaghetti hơn trước :) Nếu bạn thích bài viết và muốn xem những bài viết mới - đừng quên ủng hộ tác giả trong cuộc thi bằng cách nhấp vào "Thích" hoặc, hay hơn nữa là "Thích" :) Chúc bạn học tập tốt!
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION