потоки Java: элегантный способ фильтрации в соответствии с исключением брошен - PullRequest
0 голосов
/ 13 декабря 2018

Есть ли более элегантный способ фильтрации в зависимости от того, генерируется ли исключение?

Я имею в виду, в настоящее время мой код выглядит так:

stream.filter(item -> {
    try {
        validator.with(reference)
            .hasAccess(this.authzManager)
            .isOwner();
        } catch (EspaiDocFault | DataAccessException e) {
            return false;
        }
        return true;
    }
)

То, что я пытаюсь сделать, этоесли генерируется исключение, текущий поток элементов должен быть отфильтрован.

Я ищу любой существующий класс утилит или что-то подобное ...

Ответы [ 2 ]

0 голосов
/ 13 декабря 2018

Очень распространенный подход, который я видел во многих вариантах, - это написание собственного функционального интерфейса, который позволит генерировать проверенное исключение (1), и адаптировать это решение к встроенному интерфейсу (2).

/**
 * An EPredicate is a Predicate that allows a checked exception to be thrown.
 *
 * @param <T> the type of the input to the predicate
 * @param <E> the allowed exception
 */
@FunctionalInterface
public interface EPredicate<T, E extends Exception> {

    /**
     * (1) the method permits a checked exception
     */
    boolean test(T t) throws E;

    /**
     * (2) the method adapts an EPredicate to a Predicate.
     */
    static <T, E extends Exception> Predicate<T> unwrap(EPredicate<T, E> predicate) {
        return t -> {
            try {
                return predicate.test(t);
            } catch (Exception e) {
                return false;
            }
        };
    }

}

Пример выглядит довольно элегантно:

.stream()
.filter(EPredicate.<ItemType, Exception>unwrap(item -> validator.[...].isOwner()))

где,

  • ItemType - это тип item;
  • Exception является общим родителем EspaiDocFault и DataAccessException.

.stream()
.filter(EPredicate.unwrap(item -> validator.[...].isOwner()))
0 голосов
/ 13 декабря 2018

Библиотека Vavr имеет класс Try, который может делать то, что вы хотите:

stream.filter(item -> Try.of(() -> validator.with(reference)
                .hasAccess(this.authzManager)
                .isOwner()).getOrElse(false))

Редактировать : если вы действительно хотите знать, является лиисключение было выдано или нет, Vavr может сделать это тоже:

stream.filter(item -> Try.of([...]).isSuccess())

В качестве альтернативы, оберните все это в методе:

stream.filter(this::getMyBooleanWithinMyTry)
...