Как продолжить обработку предметов при возникновении ошибки? - PullRequest
0 голосов
/ 24 апреля 2019

Рассмотрим следующий код:

    Collection<String> foos = Arrays.asList("1", "2", "3", "X", "5", "6", "7", "8", "9", "10");

    Flowable<Integer> integerFlowable = Flowable.fromIterable(foos).map(s -> Integer.parseInt(s)).onErrorReturnItem(-1);

    PublishProcessor<Integer> processor = PublishProcessor.create();
    processor.map(i -> 2 * i).subscribe(i -> System.out.println(i), e -> System.out.println("error!"));
    integerFlowable.subscribe(processor);

Обработка завершена при достижении "X".

Как я могу дать RxJava команду продолжить работу с остальными элементами?

Ответы [ 2 ]

1 голос
/ 24 апреля 2019

Если вы пытаетесь заменить все «недействительные» входные данные заданным значением, например, -1, вы можете предоставить другую функцию отображения.

Flowable<Integer> integerFlowable = Flowable.fromIterable(foos)
    .map(s -> {
        try {
            return Integer.parseInt(s);
        } catch (NumberFormatException e) {
            return -1;
        }
    });

Вы также можете удалить все «недействительные» данные перед созданием Flowable.

Collection<String> foos = Arrays.asList("1", "2", "3", "X", "5", "6", "7", "8", "9", "10");
Collection<String> numbers = foos.stream().filter(s -> {
    try {
        Integer.parseInt(s);
        return true;
    } catch (NumberFormatException e) {
        return false;
    }
}).collect(Collectors.toList());
1 голос
/ 24 апреля 2019

Обычно верхний метод из вашего иерархии вызовов должен обрабатывать Исключение полезным способом (а не просто перехватывать). Обычно это означает, что пользователю отображается полезное сообщение об ошибке.

Для вашего случая использования может быть достаточно проверить, является ли строка числом:

if (s.matches("-?\\d+")) {
    Integer.parseInt(s)
}

Это базовый пример, который может не охватывать все ваши сценарии использования (например, начальные нули или что-то вроде переполнения).

...