JavaRush /Blog Java /Random-PL /Przestań pisać cykle! 10 najlepszych metod pracy z kolekc...

Przestań pisać cykle! 10 najlepszych metod pracy z kolekcjami z Java 8

Opublikowano w grupie Random-PL
Myślę, że nie trzeba wyjaśniać studentom JavaRush, czym są kolekcje i do czego służą. Jednak po wydaniu 8. wersji wiele elementarnych operacji, które wcześniej zajmowały 6-7 linii kodu, zostało uproszczonych do minimum. Bez zbędnych ceregieli, oto 10 najlepszych technik Java8 Collections Framework, które pozwolą Ci zaoszczędzić mnóstwo czasu i miejsca! Przestań pisać cykle!  10 najlepszych metod pracy z kolekcjami z Java 8 - 1Witam wszystkich, przyjaciele! Jak wiadomo, przyzwyczajenie jest drugą naturą. A przyzwyczajając się do pisania, for (int i = 0; i <......)w ogóle nie chcę się go uczyć na nowo (zwłaszcza, że ​​​​ten projekt jest dość prosty i zrozumiały). Jednak w pętlach wewnętrznych często powtarzamy te same operacje elementarne, których powtarzania bardzo chcielibyśmy się pozbyć. Wraz z wydaniem Java8 firma Oracle zdecydowała się nam w tym pomóc. Poniżej znajduje się 10 najlepszych metod zbierania danych, które pozwolą Ci zaoszczędzić mnóstwo czasu i kodu.

1. Iterable.forEach(akcja Consumer<? super T>)

Nazwa mówi sama za siebie. Wykonuje iterację po przekazanej kolekcji i wykonuje wyrażenie lambda actiondla każdego elementu.
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. Kolekcja.removeIf(Filtr Predicate<? super E>)

Nic skomplikowanego. Metoda iteruje po kolekcji i usuwa elementy pasujące do 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 + " "));
W jednej linijce usuwamy z listy wszystkie liczby większe od 5.

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

Metoda forEachdziała nie tylko dla klas implementujących interfejs Collection, ale także dla 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 + ". Autor: " + b));
Название книги: Братья Карамазовы. Autor: Федор Достоевский
Название книги: Философия Java. Autor: Брюс Эккель
Название книги: Преступление и наказание. Autor: Федор Достоевский
Название книги: Война и мир. Autor: Лев Толстой
Название книги: Властелин Колец. Autor: Джон Толкин

4. Map.compute(Klawisz K, BiFunction<? super K, ?super V, ? rozszerza V> remappingFunction)

Wygląda trochę bardziej zastraszająco, ale w rzeczywistości jest prosty, jak wszystkie poprzednie. Dla określonego klucza keyta metoda ustawia wartość na wynik funkcji remappingFunction. Na przykład:
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 + ". Autor: " + b));

books.compute("Философия Java", (a,b) -> b+", крутой чувак");
System.out.println("_______________________");
books.forEach((a,b) -> System.out.println("Название книги: " + a + ". Autor: " + b));
Название книги: Братья Карамазовы. Autor: Федор Достоевский
Название книги: Философия Java. Autor: Брюс Эккель
Название книги: Преступление и наказание. Autor: Федор Достоевский
Название книги: Война и мир. Autor: Лев Толстой
Название книги: Властелин Колец. Autor: Джон Толкин
_______________________
Название книги: Братья Карамазовы. Autor: Федор Достоевский
Название книги: Философия Java. Autor: Брюс Эккель, крутой чувак
Название книги: Преступление и наказание. Autor: Федор Достоевский
Название книги: Война и мир. Autor: Лев Толстой
Название книги: Властелин Колец. Autor: Джон Толкин
Autor " Filozofii Java " jest zdecydowanie fajny! :)

5. Map.computeIfAbsent(klawisz K, funkcja<? super K, ? rozszerza V> funkcja mapping)

Metoda doda nowy element do Map , ale tylko wtedy, gdy nie ma tam elementu o tym samym kluczu. Zostanie do niej przypisany wynik valuewykonania funkcji mappingFunction. Jeśli element z takim kluczem już istnieje, nie zostanie on nadpisany, lecz pozostanie na swoim miejscu. Wróćmy do naszych książek i wypróbujmy nową metodę:
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 + ". Autor: " + b));
Nasza funkcja mappingFunction:
public static String getHarryPotterAuthor() {
        return "Джоан Роулинг";
    }
A oto nowa książka:
Название книги: Братья Карамазовы. Autor: Федор Достоевский
Название книги: Философия Java. Autor: Брюс Эккель
Название книги: Преступление и наказание. Autor: Федор Достоевский
Название книги: Война и мир. Autor: Лев Толстой
Название книги: Гарри Поттер и узник Азкабана. Autor: Джоан Роулинг
Название книги: Властелин Колец. Autor: Джон Толкин

6. Map.computeIfPresent(klawisz K, BiFunction<? super K, ? super V, ? rozszerza V> remappingFunction)

Taka sama zasada jak , Map.compute()ale wszystkie obliczenia zostaną wykonane tylko wtedy, gdy element z kluczem keyjuż istnieje.
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 + ". Autor: " + b));
books.computeIfPresent("Братья Карамазовы", (a,b) -> b="Александр Пушкин");
System.out.println("_________________");
books.forEach((a,b) -> System.out.println("Название книги: " + a + ". Autor: " + b));
Kiedy funkcja została wywołana po raz pierwszy, nie zaszły żadne zmiany, bo Mapu nas nie ma książki o tytule „Eugeniusz Oniegin”. Ale po raz drugi program zmienił autora książki „Bracia Karamazow” na „Aleksander Puszkin”. Wniosek:
_________________
Название книги: Братья Карамазовы. Autor: Федор Достоевский
Название книги: Философия Java. Autor: Брюс Эккель
Название книги: Преступление и наказание. Autor: Федор Достоевский
Название книги: Война и мир. Autor: Лев Толстой
Название книги: Властелин Колец. Autor: Джон Толкин
_________________
Название книги: Братья Карамазовы. Autor: Александр Пушкин
Название книги: Философия Java. Autor: Брюс Эккель
Название книги: Преступление и наказание. Autor: Федор Достоевский
Название книги: Война и мир. Autor: Лев Толстой
Название книги: Властелин Колец. Autor: Джон Толкин

7. Map.getOrDefault(Klucz obiektu, V defaultValue)

Zwraca wartość odpowiadającą kluczowi key. Jeśli taki klucz nie istnieje, zwraca wartość domyślną.
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);
Bardzo wygodnie:
Неизвестный автор

8. Map.merge(klawisz K, wartość V, BiFunction<? super V, ? super V, ? rozszerza V> remappingFunction)

Nawet nie próbowałem obliczyć, ile linii kodu zaoszczędzi ta metoda.
  • MapJeśli klucz keynie istnieje w Twoim , lub valuedla tego klucza jest równy , nullmetoda dodaje .Mapkey-value
  • Jeżeli klucz Keyistnieje i się tam znajduje, value != nullmetoda zmienia go valuena wynik wykonania przekazanej funkcji remappingFunction.
  • Jeśli remappingFunctionzwróci null, keyzostanie usunięty z kolekcji.
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 + ". Autor: " + b));
Wniosek:
Название:Братья Карамазовы. Autor: Федор Достоевский
Название:Философия Java. Autor: Брюс Эккель и кто-то там еще
Название:Преступление и наказание. Autor: Федор Достоевский
Название:Война и мир. Autor: Лев Толстой
Название:Властелин Колец. Autor: Джон Толкин
*przepraszam, Bruce*

9. Map.putIfAbsent(klawisz K, wartość V)

Wcześniej, aby dodać parę, Mapjeśli jej nie było, trzeba było wykonać następujące czynności:
Map <String, String> map = new HashMap<>();
if (map.get("Властелин Колец") == null)
    map.put("Властелин Колец", "Джон Толкин");
Teraz wszystko stało się znacznie prostsze:
Map<String, String> map = new HashMap<>();
map.putIfAbsent("Властелин Колец", "Джон Толкин");

10. Map.replace i Map.replaceAll()

Ostatni na liście, ale nie najmniej ważny. Map.replace(K key, V newValue— zastępuje wartość klucza keyprzez newValue, jeśli taki klucz istnieje. Jeśli nie, nic się nie dzieje. Map.replace(K key, V oldValue, V newValue)- robi to samo, ale tylko wtedy, gdy bieżąca wartość keywynosi oldValue. Map.replaceAll(BiFunction<? super K, ? super V, ? extends V> function)— zastępuje wszystkie wartości valuewynikiem wykonania funkcji function. Na przykład:
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 + ". Autor: " + b));
Название:Братья Карамазовы. Autor: Федор Достоевский
Название:Философия Java. Autor: Брюс Эккель
Название:Преступление и наказание. Autor: Федор Достоевский
Название:Война и мир. Autor: Лев Толстой
Название:Властелин Колец. Autor: Джон Толкин
Nie działał! Obecna wartość klucza Braci Karamazow to Fiodor Dostojewski, a nie Bruce Eckel, więc nic się nie zmieniło.
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 + ". Autor: " + b));
public static String getCoolWriter() {
        return "Крутой писатель";
    }
Название:Братья Карамазовы. Autor: Крутой писатель
Название:Философия Java. Autor: Крутой писатель
Название:Преступление и наказание. Autor: Крутой писатель
Название:Война и мир. Autor: Крутой писатель
Название:Властелин Колец. Autor: Крутой писатель
Łatwo zmieniaj wartości dla całej mapy bez żadnych skomplikowanych konstrukcji! PS Przyzwyczajenie się do czegoś nowego jest zawsze trudne, ale te zmiany są naprawdę dobre. W każdym razie niektóre fragmenty mojego kodu są teraz zdecydowanie mniej spaghetti niż wcześniej :) Jeśli artykuł przypadł Ci do gustu i chciałbyś zobaczyć nowe - nie zapomnij wesprzeć autora w konkursie klikając "Lubię to" lub, jeszcze lepiej „Lubię to” :) Powodzenia na studiach!
Komentarze
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION