Автор оригинала: Suresh Atta.
Прошло довольно много времени с тех пор, как была выпущена Java 8. Java-программисты по всему миру уже начали использовать его в своих новых проектах. Однако недавно я наткнулся на статью, в которой говорилось, что наиболее часто используемыми функциями Java 8 являются потоки, которые являются коллекциями по требованию. С другой стороны, собственный API сбора данных также был улучшен и добавил несколько полезных и мощных функций. Глядя на проекты с открытым исходным кодом на GitHub и некоторые коды корпоративных проектов, построенные на Java 8, я редко вижу, как используются новые методы фреймворка коллекций, и люди в основном используют методы старой школы.
Поэтому я решил изучить изменения в структуре коллекций одно за другим. Поскольку изменений много,давайте сначала посмотрим, какие изменения произошли с картой. Произошло много изменений во внутренней архитектуре/производительности но я просто собираюсь обсудить полезные методы, которые были добавлены.
Сортировка карты напрямую с помощью компараторов.
Как мы знаем, карта в порядке, разобраться в ней очень сложно. Теперь в интерфейс карты добавлены методы по умолчанию, которые предоставляют вам компараторы для разных стилей, таких как comparingByKey
, Сравнение стоимости
.
Mapmap = 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
метод. До сих пор это очень показательная функция на карте. Мы все знаем, насколько уродлив старомодный способ итерации, и, наконец, разработчики добавили метод по умолчанию Для каждого
. Теперь очень легко перебирать карту, как Список
.
Mapmap = 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
. Этот метод возвращает значение, которому сопоставлен указанный ключ, в противном случае возвращает заданное значение по умолчанию, если эта карта не содержит сопоставления для ключа.
Mapmap = new HashMap<>(); map.put("C", "c"); String val = map.getOrDefault("B", "Nah!"); System.out.println(val); // prints Nah!
Замените и удалите утилиты.
Теперь добавлены новые методы утилиты по умолчанию. replaceAll
Может заменить все значения за одну попытку
Mapmap = 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
Поскольку название метода не требует пояснений, вот пример.
Mapmap = new HashMap<>(); map.put("C", "c"); map.put("B", "b"); map.putIfAbsent("B", "x"); System.out.println(map.get("B")); // prints "b"
действуйте непосредственно на значениях.
Прошли те времена, когда вам нужно было получить значение для определенных ключей, обработать его и вернуть обратно. Теперь вы можете напрямую изменять с помощью компьютерного метода.
Mapmap = 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
методы.
Для объединения карт используйте метод слияния.
Это немного сложнее и более полезно, когда вы комбинируете карты или добавляете значения для дублированных ключей.
Документы говорят
Если указанный ключ еще не связан со значением или связан с нулем, свяжите его с заданным ненулевым значением. В противном случае заменяет связанное значение результатами данной функции переназначения или удаляет, если результат равен нулю.
Чтобы просто продемонстрировать это, просто объедините значения ключа со старым и новым, см. Пример ниже.
Mapmap = 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”