code: public static Stream<Map.Entry<Method, Object>> getters(Object obj, Predicate<Method> predicate) {
  		Class<?> clazz = obj == null ? ObjectIsNull.class : obj.getClass();
  		return Arrays.asList(clazz.getMethods()).stream()
  				// we only want methods that don't take parameters
  				.filter(method -> method.getParameterTypes().length == 0)
  				// we only want public methods
  				.filter(method -> Modifier.isPublic(method.getModifiers()))
  				// we only want instance methods
  				.filter(method -> !Modifier.isStatic(method.getModifiers()))
  				// we only want methods that don't return void
  				.filter(method -> !method.getReturnType().equals(Void.TYPE))
  				// we only want methods that pass our predicate
  				.filter(predicate)
  				// turn it into Map<Method, Result>
  				.map(method -> createEntry(method, tryCall(method.getName(), () -> method.invoke(obj))));
  	}
docs: Returns a {@code Stream} of all public getter methods which match {@code predicate} and their return values for the given object.
  <p>
  This method uses reflection to find all of the public instance methods which don't take any arguments
  and return a value.  If they pass the given predicate, then they are called, and the return value is
  included in a stream of {@code Map.Entry<Method, Object>}.
  <p>
  Note that there are some methods which have the signature of a getter, but actually mutate the object
  being inspected, e.g. {@link java.io.InputStream#read()}.  These will be called unless you manually
  exclude them using the predicate.