code: @Beta
      public static <T, E extends Throwable> T check(T reference, Predicate<T> predicate, E throwable) throws E {
          checkArgument(reference != null, "Expected non-null reference");
          checkArgument(predicate != null, "Expected non-null predicate");
          check(predicate.apply(reference), throwable);
          return reference;
      }
docs: Performs check with the predicate.
  
  @param reference reference to check
  @param predicate the predicate to use
  @param throwable the throwable to throw
  @param <T>       the reference type
  @param <E>       the exception type
  @return the original reference
  @throws IllegalArgumentException if the {@code reference}, {@code predicate} or {@code throwableType} is null
  @throws IllegalArgumentException if the {@code throwableType} cannot be instantiated
  @throws E                        if the {@code reference} doesn't match provided predicate