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.favtuts.java8; import java.util.HashMap; import java.util.Map; import java.util.stream.Collectors; public class TestMapFilter { public static void main(String[] args) { filterMapByValues(); } private static void filterMapByValues() { 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.com
With Java 8 : linode.com,heroku.com
2. Java 8 – Filter a Map #2
Yet another example to filter a Map
by key, but this time will return a Map
TestMapFilter2.java
package com.favtuts.java8; import java.util.HashMap; import java.util.Map; import java.util.stream.Collectors; public class TestMapFilter { public static void main(String[] args) { filterMapByKeyReturnOtherMap(); } private static void filterMapByKeyReturnOtherMap() { 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 Predicate
adsf
package com.favtuts.java8; import java.util.HashMap; import java.util.Map; import java.util.function.Predicate; import java.util.stream.Collectors; public class TestMapFilter { public static void main(String[] args) { filterMapByUsingPredicate(); } private static void filterMapByUsingPredicate() { 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); } // 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)); } }
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}
Download Source Code
$ git clone https://github.com/favtuts/java-core-tutorials-examples
$ cd java-basic/java8