Рубрики
Без рубрики

Изменения API коллекции Java 8 Часть 1 – Карта

Изменения API коллекции Java 8 Часть 1 – Карта

Автор оригинала: Suresh Atta.

Прошло довольно много времени с тех пор, как была выпущена Java 8. Java-программисты по всему миру уже начали использовать его в своих новых проектах. Однако недавно я наткнулся на статью, в которой говорилось, что наиболее часто используемыми функциями Java 8 являются потоки, которые являются коллекциями по требованию. С другой стороны, собственный API сбора данных также был улучшен и добавил несколько полезных и мощных функций. Глядя на проекты с открытым исходным кодом на GitHub и некоторые коды корпоративных проектов, построенные на Java 8, я редко вижу, как используются новые методы фреймворка коллекций, и люди в основном используют методы старой школы.

Поэтому я решил изучить изменения в структуре коллекций одно за другим. Поскольку изменений много,давайте сначала посмотрим, какие изменения произошли с картой. Произошло много изменений во внутренней архитектуре/производительности но я просто собираюсь обсудить полезные методы, которые были добавлены.

Сортировка карты напрямую с помощью компараторов.

Как мы знаем, карта в порядке, разобраться в ней очень сложно. Теперь в интерфейс карты добавлены методы по умолчанию, которые предоставляют вам компараторы для разных стилей, таких как comparingByKey , Сравнение стоимости .

    Map map = new HashMap<>();
    map.put("C", "c");
    map.put("B", "b");
    map.put("Z", "z");
    List> sortedByKey = map.entrySet().stream().sorted(Map.Entry.comparingByKey())
        .collect(Collectors.toList());
    sortedByKey.forEach(System.out::println);

output : 

B=b
C=c
Z=z

Легко перебирайте карту с помощью forEach.

Если вы наблюдаете приведенный выше пример кода, то при печати я использовал метод forEach метод. До сих пор это очень показательная функция на карте. Мы все знаем, насколько уродлив старомодный способ итерации, и, наконец, разработчики добавили метод по умолчанию Для каждого . Теперь очень легко перебирать карту, как Список .

    Map map = new HashMap<>();
    map.put("C", "c");
    map.put("B", "b");
    map.put("Z", "z");
    map.forEach((k, v) -> System.out.println("Key : " + k + " Value : " + v));

output : 

Key : B Value : b
Key : C Value : c
Key : Z Value : z


Избавьтесь от уродливого условия if-else, используйте метод getOrDefault.

Устаревший код для проверки containsKey перешел на метод по умолчанию getOrDefault . Этот метод возвращает значение, которому сопоставлен указанный ключ, в противном случае возвращает заданное значение по умолчанию, если эта карта не содержит сопоставления для ключа.

    Map map = new HashMap<>();
    map.put("C", "c");
    String val = map.getOrDefault("B", "Nah!");
    System.out.println(val); // prints Nah!

Замените и удалите утилиты.

Теперь добавлены новые методы утилиты по умолчанию. replaceAll Может заменить все значения за одну попытку

    Map map = new HashMap<>();
    map.put("C", "c");
    map.put("B", "b");
    map.replaceAll((k, v) -> "x"); // values is "x" for all keys.  

И метод replace(K ключ, V старое значение, V новое значение) заменяет запись для указанного ключа только в том случае, если в данный момент она сопоставлена с указанным значением. Таким же образом вы можете использовать заменить , удалить методы для проверки пар ключей и значений вместе.

Не переопределяйте ключи случайно с помощью putIfAbsent

Поскольку название метода не требует пояснений, вот пример.

    Map map = new HashMap<>();
    map.put("C", "c");
    map.put("B", "b");
    map.putIfAbsent("B", "x");
    System.out.println(map.get("B")); // prints "b"

действуйте непосредственно на значениях.

Прошли те времена, когда вам нужно было получить значение для определенных ключей, обработать его и вернуть обратно. Теперь вы можете напрямую изменять с помощью компьютерного метода.

    Map map = new HashMap<>();
    map.put("C", "c");
    map.put("B", "b");
    map.compute("B", (k, v) -> v.concat(" - new "));
    System.out.println(map.get("B")); // prints "b - new"

Также доступны условные компьютеры. Посмотрите на computeIfPresent , computeIfAbsent методы.

Для объединения карт используйте метод слияния.

Это немного сложнее и более полезно, когда вы комбинируете карты или добавляете значения для дублированных ключей.

Документы говорят

Если указанный ключ еще не связан со значением или связан с нулем, свяжите его с заданным ненулевым значением. В противном случае заменяет связанное значение результатами данной функции переназначения или удаляет, если результат равен нулю.

Чтобы просто продемонстрировать это, просто объедините значения ключа со старым и новым, см. Пример ниже.

    Map map = new HashMap<>();
    map.put("C", "c");
    map.put("B", "b");
    map.merge("B", "NEW", (v1, v2) -> v1 + v2);
    System.out.println(map.get("B")); // prints bNEW

На данный момент это все, и давайте встретимся в следующей статье, посвященной другим изменениям в коллекции с помощью Java 8.

Оригинал: “https://www.codementor.io/@sureshatta/java-8-collection-api-changes-part1-map-5kdf0vjkx”