Java hashmap stream filter

Содержание
  1. Rukovodstvo
  2. статьи и идеи для разработчиков программного обеспечения и веб-разработчиков.
  3. Как отфильтровать карту по ключу или значению в Java
  4. Введение Реализации карты в Java представляют структуры, которые отображают ключи в значения. Карта не может содержать повторяющиеся ключи, и каждый может быть сопоставлен не более чем с одним значением. Карта реализации являются общими и допускают отображение любых K (ключ) и V (значение). Интерфейс карты также включает методы для некоторых основных операций (таких как put (), get (), containsKey (), containsValue (), size () и т. Д.), Массовых операций (таких как putAll () и clear ()) и представления коллекций (например, keySet (), entr
  5. Вступление
  6. Фильтрация карты с помощью расширенных циклов for
  7. Stream.filter ()
  8. Фильтрация карты по ключам с помощью Stream.filter ()
  9. Отфильтруйте карту по значениям с помощью Stream.filter ()
  10. Заключение
  11. How to Filter a Map by Key or Value in Java
  12. Filter a Map with enhanced for-loops
  13. Stream.filter()
  14. Filter a Map by Keys with Stream.filter()
  15. Filter a Map by Values with Stream.filter()
  16. Free eBook: Git Essentials
  17. Conclusion

Rukovodstvo

статьи и идеи для разработчиков программного обеспечения и веб-разработчиков.

Как отфильтровать карту по ключу или значению в Java

Введение Реализации карты в Java представляют структуры, которые отображают ключи в значения. Карта не может содержать повторяющиеся ключи, и каждый может быть сопоставлен не более чем с одним значением. Карта реализации являются общими и допускают отображение любых K (ключ) и V (значение). Интерфейс карты также включает методы для некоторых основных операций (таких как put (), get (), containsKey (), containsValue (), size () и т. Д.), Массовых операций (таких как putAll () и clear ()) и представления коллекций (например, keySet (), entr

Вступление

Map в Java представляют структуры, которые отображают ключи в значения . Map не может содержать повторяющиеся ключи, и каждый может быть сопоставлен не более чем с одним значением. Реализации Map являются общими и K (ключ) и V (значение).

Читайте также:  Php object type stdclass

Интерфейс Map также включает методы для некоторых основных операций (таких как put() , get() , containsKey() , containsValue() , size() и т. Д.), putAll() и clear() ) и представления коллекций (такие как keySet() , entrySet() и values() ).

Наиболее известными Map используемыми для общих целей, являются: HashMap , TreeMap и LinkedHashMap .

В этой статье мы рассмотрим, как фильтровать карту по ее ключам и значениям :

Фильтрация карты с помощью расширенных циклов for

Давайте HashMap несколькими парами ключ-значение:

 Map employeeMap = new HashMap<>(); employeeMap.put(35, "Mark"); employeeMap.put(40, "John"); employeeMap.put(23, "Michael"); employeeMap.put(31, "Jim"); employeeMap.put(25, "Kevin"); 

Map имеет ключи типа Integer и значения типа String . Они представляют возраст и имя сотрудников.

Мы отфильтруем эту карту по ключам и значениям и сохраним результаты в Collection , например в другой Map или даже в другом HashMap .

Давайте перейдем к LinkedHashMap который сохраняет порядок вставки:

 Map linkedHashMap = new LinkedHashMap<>(); for (Map.Entry employee : employeeMap.entrySet()) < if(employee.getKey() >30) < linkedHashMap.put(employee.getKey(), employee.getValue()); >> System.out.println("Filtered Map: " + linkedHashMap); 

Здесь мы прошли entrySet() в employeeMap и добавили каждого сотрудника в LinkedHashMap помощью его метода put() Это будет работать точно так же для HashMap , но не сохранит порядок вставки:

Фильтрация по значениям сводится к тому же подходу, хотя мы будем проверять значение каждой записи и использовать это в условии:

 Map linkedHashMap = new LinkedHashMap<>(); for (Map.Entry employee : employeeMap.entrySet()) < if(employee.getValue().equals("Mark"))< linkedHashMap.put(employee.getKey(), employee.getValue()); >> System.out.println("Filtered Map: " + linkedHashMap); 

Это ручной способ фильтрации карты — повторение и выбор желаемых элементов. Давайте теперь посмотрим на более читаемый и удобный способ — через Stream API.

Stream.filter ()

Более современный способ фильтрации карт — это использование Stream API из Java 8, что делает этот процесс более читаемым. Метод filter() Stream , как следует из названия, фильтрует любую Collection на основе заданного условия.

Например, учитывая Collection имен, вы можете отфильтровать их на основе таких условий, как — содержащие определенные символы или начинающиеся с определенного символа.

Фильтрация карты по ключам с помощью Stream.filter ()

Давайте воспользуемся Stream API, чтобы отфильтровать ту же карту при тех же условиях. Мы будем stream() entrySet() карты и collect() ее обратно в Map :

 Map filteredMap = employeeMap.entrySet() .stream().filter(x->x.getKey() > 30) .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); System.out.println("Filtered map: " + filteredMap); 

То, что делает этот код, очень похоже на то, что мы делали вручную — для каждого элемента в наборе карты мы проверяем, превышает ли значение их ключа 30 и собираем значения в новую Map с соответствующими ключами и значениями, предоставленными через getKey() и getValue() :

Отфильтруйте карту по значениям с помощью Stream.filter ()

Теперь давайте заполним другую карту и вместо пары ключ-значение :

 Map cityMap = new HashMap<>(); cityMap.put("Tokyo", "Japan"); cityMap.put("Berlin", "Germany"); cityMap.put("Kyoto", "Japan"); cityMap.put("Belgrade", "Serbia"); cityMap.put("Madrid", "Spain"); 

На этот раз у нас есть пары город-страна , где ключи — это отдельные города, а значения — страны, в которых они расположены. Значения не обязательно должны быть уникальными. Kyoto и Tokyo , которые являются уникальными ключами, могут иметь одно и то же значение — Japan .

Сортировка этой карты по значениям, опять же, сводится к тому же подходу, что и раньше — мы просто будем использовать значение с помощью getValue() в условии фильтрации:

 Map filteredMap = citiesMap.entrySet() .stream().filter(x->"Japan".equals(x.getValue())) .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); System.out.println("Filtered map: " + filteredMap) 

Теперь это приводит к отфильтрованной карте, которая содержит и Tokyo и Kyoto :

Здесь вы можете проявить творческий подход к результатам и результатам. Например, вместо того, чтобы помещать эти элементы в новую карту и возвращать ее, мы можем манипулировать полученным значением и в других структурах. Например, мы могли бы отфильтровать ключи, которые имеют значения Japan и Serbia , и объединить ключи в одну String :

 String filteredMap = citiesMap.entrySet() .stream().filter(x-> x.getValue().equals("Japan") || x.getValue().equals("Serbia")) .map(Map.Entry::getKey).collect(Collectors.joining(", ")); System.out.println("Filtered map: " + filteredMap); 

Здесь мы использовали другой Collector чем раньше. Collectors.joining() возвращает новый Collector который объединяет элементы в String . Помимо CharSequence delimiter , мы могли бы также предоставить CharSequence prefix CharSequence suffix для каждого присоединенного элемента.

Это приводит к String , со всеми из отфильтрованных элементов, разделенный , :

 Filtered map: Belgrade, Tokyo, Kyoto 

Заключение

В этой статье мы рассмотрели, как фильтровать Map в Java. Сначала мы рассмотрели, как использовать расширенные циклы for для проектов до Java 8, после чего мы погрузились в API Steam и применили метод filter() .

Фильтрация карт по значениям или ключам превращается в простую однострочную задачу с помощью Stream API, и у вас есть широкий выбор Collector для форматирования вывода по своему вкусу.

Licensed under CC BY-NC-SA 4.0

Источник

How to Filter a Map by Key or Value in Java

Map implementations in Java represent structures that map keys to values. A Map cannot contain duplicate keys and each can at most be mapped to one value. The Map implementations are generic and accept any K (key) and V (value) to be mapped.

The Map interface also includes methods for some basic operations (such as put() , get() , containsKey() , containsValue() , size() , etc.), bulk operations (such as putAll() and clear() ) and collection views (such as keySet() , entrySet() and values() ).

The most prominent Map implementations used for general purposes are: HashMap , TreeMap and LinkedHashMap .

In this article, we’ll take a look at how to filter a Map by its keys and values:

Filter a Map with enhanced for-loops

Let’s populate a HashMap with some key-value pairs:

Map employeeMap = new HashMap<>(); employeeMap.put(35, "Mark"); employeeMap.put(40, "John"); employeeMap.put(23, "Michael"); employeeMap.put(31, "Jim"); employeeMap.put(25, "Kevin"); 

The Map has keys of type Integer and values of type String . They represent the age and name of the employees.

We’ll filter this map by keys and values and save the results in a Collection , such as another Map implementation, or even another HashMap .

Let’s go with the LinkedHashMap which preserves the order of insertion:

Map linkedHashMap = new LinkedHashMap<>(); for (Map.Entry employee : employeeMap.entrySet()) < if(employee.getKey() > 30) < linkedHashMap.put(employee.getKey(), employee.getValue()); >> System.out.println("Filtered Map: " + linkedHashMap); 

Here, we’ve gone through the entrySet() of the employeeMap , and added each employee into a LinkedHashMap via its put() method. This would work the exact same for the HashMap implementation, but it wouldn’t preserve the order of insertion:

Filtering out by values boils down to much the same approach, albeit, we’ll be checking the value of each entry and using that in a condition:

Map linkedHashMap = new LinkedHashMap<>(); for (Map.Entry employee : employeeMap.entrySet()) < if(employee.getValue().equals("Mark")) < linkedHashMap.put(employee.getKey(), employee.getValue()); >> System.out.println("Filtered Map: " + linkedHashMap); 

This is the manual way to filter a map — iterating and picking the desired elements. Let’s now take a look at a more readable, and friendlier way — via the Stream API.

Stream.filter()

A more modern way to filter maps would be leveraging the Stream API from Java 8, which makes this process much more readable. The filter() method of the Stream class, as the name suggests, filters any Collection based on a given condition.

For example, given a Collection of names, you can filter them out based on conditions such as — containing certain characters or starting with a specific character.

Filter a Map by Keys with Stream.filter()

Let’s leverage the Stream API to filter out this same map given the same condition. We’ll stream() the entrySet() of the map, and collect() it back into a Map :

Map filteredMap = employeeMap.entrySet() .stream().filter(x->x.getKey() > 30) .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); System.out.println("Filtered map: " + filteredMap); 

What this code does is much the same as what we did manually — for each element in the map’s set, we check if their key’s value is greater than 30 and collect the values into a new Map , with their respective keys and values supplied through the getKey() and getValue() method references:

Filter a Map by Values with Stream.filter()

Now, let’s populate another map, and instead of a key-value pair, we’ll use a pair:

Free eBook: Git Essentials

Check out our hands-on, practical guide to learning Git, with best-practices, industry-accepted standards, and included cheat sheet. Stop Googling Git commands and actually learn it!

Map cityMap = new HashMap<>(); cityMap.put("Tokyo", "Japan"); cityMap.put("Berlin", "Germany"); cityMap.put("Kyoto", "Japan"); cityMap.put("Belgrade", "Serbia"); cityMap.put("Madrid", "Spain"); 

This time around, we’ve got city-country pairs, where keys are individual cities, and the values are the countries they’re located in. Values don’t have to be unique. Kyoto and Tokyo , which are both unique keys can have the same value — Japan .

Sorting this map by values, again, boils down to much the same approach as before — we’ll simply use the value, via the getValue() method in the filtering condition:

Map filteredMap = citiesMap.entrySet() .stream().filter(x->"Japan".equals(x.getValue())) .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); System.out.println("Filtered map: " + filteredMap) 

Now, this results in a filtered map that contains both Tokyo and Kyoto :

You can get creative with the outputs and results here. For example, instead of putting these elements into a new map and returning that — we can manipulate the resulting value into other structures as well. For example, we could filter out the keys what have Japan and Serbia as values, and join the keys into a single String :

String filteredMap = citiesMap.entrySet() .stream().filter(x-> x.getValue().equals("Japan") || x.getValue().equals("Serbia")) .map(Map.Entry::getKey).collect(Collectors.joining(", ")); System.out.println("Filtered map: " + filteredMap); 

Here, we’ve used a different Collector than before. The Collectors.joining() returns a new Collector that joins the elements into a String . Other than the CharSequence delimiter we’ve passed in, we could’ve also supplied a CharSequence prefix and CharSequence suffix for each joined element.

This results in a String , with all of the filtered elements, separated by a , :

Filtered map: Belgrade, Tokyo, Kyoto 

Conclusion

In this article, we’ve taken a look at how to filter a Map in Java. We’ve first gone over how to use enhanced for-loops for pre-Java 8 projects, after which we’ve dived into the Steam API and leveraged the filter() method.

Filtering maps by either values or keys is rendered into a simple, one-liner task with the help of the Stream API, and you have a wide variety of Collector s to format the output to your liking.

Источник

Оцените статью