package com.levelup.java.collections;
import static org.hamcrest.collection.IsIterableContainingInOrder.contains;
import static org.junit.Assert.assertThat;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.stream.Collectors;
import org.apache.log4j.Logger;
import org.junit.Before;
import org.junit.Test;
import com.google.common.base.Predicate;
import com.google.common.collect.Maps;
/**
* This java example will demonstrate how to filter
* a map by keys.
*
* @author Justin Musgrove
* @see <a href='http://www.leveluplunch.com/java/examples/filter-map-by-key/'>Filter map by key</a>
*
*/
public class FilterMapByKeys {
private static final Logger logger = Logger.getLogger(FilterMapByKeys.class);
Map<Integer, String> MONTHS = new HashMap<Integer, String>();
@Before
public void setUp () {
MONTHS.put(new Integer(1), "January");
MONTHS.put(new Integer(2), "February");
MONTHS.put(new Integer(3), "March");
MONTHS.put(new Integer(4), "April");
MONTHS.put(new Integer(5), "May");
MONTHS.put(new Integer(6), "June");
MONTHS.put(new Integer(7), "July");
MONTHS.put(new Integer(8), "August");
MONTHS.put(new Integer(9), "September");
MONTHS.put(new Integer(10), "October");
MONTHS.put(new Integer(11), "November");
MONTHS.put(new Integer(12), "December");
}
@Test
public void filter_map_by_keys_java () {
Map<Integer, String> firstQuarter = new HashMap<Integer, String>();
for (Entry<Integer, String> entry : MONTHS.entrySet()) {
if (entry.getKey().intValue() <= 4) {
firstQuarter.put(entry.getKey(), entry.getValue());
}
}
logger.info(firstQuarter);
assertThat(firstQuarter.keySet(), contains(
1, 2, 3, 4));
}
@Test
public void filter_map_by_keys_java8_lambda () {
Map<Integer, String> firstQuarter =
MONTHS.entrySet()
.stream()
.filter(p -> p.getKey().intValue() <= 4)
.collect(Collectors.toMap(p -> p.getKey(), p -> p.getValue()));
logger.info(firstQuarter);
assertThat(firstQuarter.keySet(), contains(
1, 2, 3, 4));
}
@Test
public void filter_map_by_keys_guava () {
Predicate<Integer> byFirstQuarter = new Predicate<Integer>() {
@Override
public boolean apply(Integer input) {
return input.intValue() <= 4;
}
};
Map<Integer, String> firstQuarter = Maps.filterKeys(MONTHS, byFirstQuarter);
logger.info(firstQuarter);
assertThat(firstQuarter.keySet(), contains(
1, 2, 3, 4));
}
}