发生错误时如何处理项目?

时间:2019-04-24 15:18:20

标签: java rx-java rx-java2

考虑以下代码:

    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 个答案:

答案 0 :(得分:1)

通常,调用层次结构中的上层方法应以有用的方式处理Exception(而不仅仅是捕获)。通常,这意味着向用户显示有用的错误消息。

对于您的用例,也许足以检查字符串是否为数字:

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

这是一个基本示例,可能无法涵盖您的所有用例(例如,前导零或类似溢出的内容)。

答案 1 :(得分:1)

如果尝试用给定值(例如-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());