code: public static <K, V> Map<K, V> filter(Map<K, V> original, final Function2<? super K, ? super V, Boolean> predicate) {
  		if (predicate == null)
  			throw new NullPointerException("predicate");
  		return Maps.filterEntries(original, new Predicate<Map.Entry<K, V>>() {
  			@Override
  			public boolean apply(Map.Entry<K, V> input) {
  				Boolean result = predicate.apply(input.getKey(), input.getValue());
  				return result.booleanValue();
  			}
  		});
  	}
docs: <p>
  Returns a filtered live view on top of the original map. Changes to one affect the other.
  </p>
  
  <p>
  The mapping is done lazily. That is, subsequent access of the values in the map will repeatedly apply the
  transformation. Characteristics of the original map, such as iteration order, are left intact. Changes in the
  original map are reflected in the result map. The results supports removal if the original map supports removal.
  </p>
  
  @param original
  the original map. May not be <code>null</code>.
  @param predicate
  the predicate. May not be <code>null</code>.
  @return a filtered view on top of the original map. Never <code>null</code>.