Является ли takeWhile правильным способом эмулировать разрыв в цикле - PullRequest
0 голосов
/ 08 февраля 2019

Предположим, что мне нужно применить некоторую функцию к каждому элементу потока, пока не будет выполнено определенное условие.Однако, чтобы проверить условие, мне нужно применить функцию, поэтому разделение на takeWhile и forEachOrdered не будет работать.Например,

stream.map(...).takeWhile(p -> {
    try {
        write(p);
        return true;
    } catch (IOException e) {
        log(e.getMessage());
        return false;
    }
});

Здесь я не хочу многократный сбой log, поэтому после сбоя write я бы хотел прекратить итерации.

У меня есть сомнениячто это правильное (?) решение, потому что результат takeWhile не используется и просто избыточен.

Есть ли лучший способ справиться с ситуацией?Мое решение на самом деле хорошо?

1 Ответ

0 голосов
/ 08 февраля 2019

Вы неправильно используете takeWhile.Для вашего случая было бы достаточно использовать forEachOrdered, потому что, если возникнет исключение, остальные элементы потока не будут обработаны:

try {
    stream.map(...).forEachOrdered(p -> {
        try {
            write(p);
        } catch (IOException e) {
            throw new UncheckedIOException(e);
        }
    });
} catch (UncheckedIOException e) {
    log(e.getCause().getMessage());
}

Здесь e.getCause() - этооригинал IOException брошенный write.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...