Java 8 – Filter a Map examples
Few Java examples to show you how to filter a Map with Java 8 stream API.Before Java 8 :
Map<Integer, String> map = new HashMap<>();
map.put(1, "linode.com"); map.put(2, "heroku.com"); String result = ""; for (Map.Entry<Integer, String> entry : map.entrySet()) { if("something".equals(entry.getValue())){ result = entry.getValue(); } }With Java 8, you can convert a Map.entrySet() into a stream, follow by a filter() and collect() it.
Map<Integer, String> map = new HashMap<>();
map.put(1, "linode.com"); map.put(2, "heroku.com"); //Map -> Stream -> Filter -> String String result = map.entrySet().stream() .filter(x -> "something".equals(x.getValue())) .map(x->x.getValue()) .collect(Collectors.joining());//Map -> Stream -> Filter -> MAP
Map<Integer, String> collect = map.entrySet().stream() .filter(x -> x.getKey() == 2) .collect(Collectors.toMap(x -> x.getKey(), x -> x.getValue())); // or like this Map<Integer, String> collect = map.entrySet().stream() .filter(x -> x.getKey() == 3) .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));1. Java 8 – Filter a Map
A full example to filter a Map by values and return a String.TestMapFilter.java
package com.mkyong;import java.util.HashMap;
import java.util.Map;import java.util.stream.Collectors;public class TestMapFilter {
public static void main(String[] args) {
Map<Integer, String> HOSTING = new HashMap<>();
HOSTING.put(1, "linode.com"); HOSTING.put(2, "heroku.com"); HOSTING.put(3, "digitalocean.com"); HOSTING.put(4, "aws.amazon.com");// Before Java 8
String result = ""; for (Map.Entry<Integer, String> entry : HOSTING.entrySet()) { if ("aws.amazon.com".equals(entry.getValue())) { result = entry.getValue(); } } System.out.println("Before Java 8 : " + result);//Map -> Stream -> Filter -> String
result = HOSTING.entrySet().stream() .filter(map -> "aws.amazon.com".equals(map.getValue())) .map(map -> map.getValue()) .collect(Collectors.joining());System.out.println("With Java 8 : " + result);
// filter more values
result = HOSTING.entrySet().stream() .filter(x -> { if (!x.getValue().contains("amazon") && !x.getValue().contains("digital")) { return true; } return false; }) .map(map -> map.getValue()) .collect(Collectors.joining(","));System.out.println("With Java 8 : " + result);
}
}
Output
Before Java 8 : aws.amazon.com
With Java 8 : aws.amazon.comWith Java 8 : linode.com,heroku.com2. Java 8 – Filter a Map #2
Yet another example to filter a Map by key, but this time will return a MapTestMapFilter2.java
package com.mkyong;import java.util.HashMap;
import java.util.Map;import java.util.stream.Collectors;public class TestMapFilter2 {
public static void main(String[] args) {
Map<Integer, String> HOSTING = new HashMap<>();
HOSTING.put(1, "linode.com"); HOSTING.put(2, "heroku.com"); HOSTING.put(3, "digitalocean.com"); HOSTING.put(4, "aws.amazon.com");//Map -> Stream -> Filter -> Map
Map<Integer, String> collect = HOSTING.entrySet().stream() .filter(map -> map.getKey() == 2) .collect(Collectors.toMap(p -> p.getKey(), p -> p.getValue()));System.out.println(collect); //output : {2=heroku.com}
Map<Integer, String> collect2 = HOSTING.entrySet().stream()
.filter(map -> map.getKey() <= 3) .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));System.out.println(collect2); //output : {1=linode.com, 2=heroku.com, 3=digitalocean.com}
}
}
Output
{2=heroku.com}
{1=linode.com, 2=heroku.com, 3=digitalocean.com}3. Java 8 - Filter a Map #3 - Predicate
This time, try the new Java 8 PredicateTestMapFilter3.java
package com.mkyong;import java.util.HashMap;
import java.util.Map;import java.util.function.Predicate;import java.util.stream.Collectors;public class TestMapFilter3 {
// Generic Map filterbyvalue, with predicate
public static <K, V> Map<K, V> filterByValue(Map<K, V> map, Predicate<V> predicate) { return map.entrySet() .stream() .filter(x -> predicate.test(x.getValue())) .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); }public static void main(String[] args) {
Map<Integer, String> HOSTING = new HashMap<>();
HOSTING.put(1, "linode.com"); HOSTING.put(2, "heroku.com"); HOSTING.put(3, "digitalocean.com"); HOSTING.put(4, "aws.amazon.com"); HOSTING.put(5, "aws2.amazon.com");// {1=linode.com}
Map<Integer, String> filteredMap = filterByValue(HOSTING, x -> x.contains("linode")); System.out.println(filteredMap);// {1=linode.com, 4=aws.amazon.com, 5=aws2.amazon.com}
Map<Integer, String> filteredMap2 = filterByValue(HOSTING, x -> (x.contains("aws") || x.contains("linode"))); System.out.println(filteredMap2);// {4=aws.amazon.com}
Map<Integer, String> filteredMap3 = filterByValue(HOSTING, x -> (x.contains("aws") && !x.contains("aws2"))); System.out.println(filteredMap3);// {1=linode.com, 2=heroku.com}
Map<Integer, String> filteredMap4 = filterByValue(HOSTING, x -> (x.length() <= 10)); System.out.println(filteredMap4);}
}
Output
{1=linode.com}
{1=linode.com, 4=aws.amazon.com, 5=aws2.amazon.com}{4=aws.amazon.com}{1=linode.com, 2=heroku.com}http://www.mkyong.com/java8/java-8-filter-a-map-examples/