как фильтровать элементы, которые выдают исключение во время карты потока - PullRequest
0 голосов
/ 15 ноября 2018

Я следовал за статьей https://www.oreilly.com/ideas/handling-checked-exceptions-in-java-streams для извлечения метода в метод для обработки исключений и заметил, что приведенные примеры выглядят чисто, поскольку на самом деле они не компилируются, поскольку пропускают оператор return.
По сути, я ищу метод синтаксического анализа, подобный этому разделению в примере статьи 3, но мой анализирует список, и в некоторых сценариях он выдает ошибки, регистрирует их и продолжает, как здесь:

public List<String> validator(List<String> values) {
    return values.stream()
        .map(this::parse)
        .filter(Objects::nonNull)
        .collect(Collectors.toList());
}
public String parse(String s){
    try{
         // returns something or throws exceptions
    } catch (Exception e ){
       log(e)
    }
    return null;
}

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

1 Ответ

0 голосов
/ 15 ноября 2018

Что касается меня, то ваш способ пропустить null элементов довольно хорош.

Однако, если вы хотите сделать это функционально, тогда вообще не возвращайте null. Верните Optional вместо:

public Optional<String> parse(String s){
    try{
        return Optional.of(<parsed_value>);
    } catch (Exception e ){
        log(e);
    }
    return Optional.empty();
}

Java 1.8 решение:

public List<String> validator(List<String> values) {
     return values.stream()
                  .map(this::parse)
                  .filter(Optional::isPresent)
                  .map(Optional::get)
                  .collect(Collectors.toList());
}

Java 1.9 + решение: (как уже предложено @ Holger уже):

 public List<String> validator(List<String> values) {
     return values.stream()
                  .map(this::parse)
                  .flatMap(Optional::stream)
                  .collect(Collectors.toList());
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...