在传递给Java 8流的映射函数中,实现检查异常处理的更好方法

问题描述 投票:1回答:1

我有一个简单的场景,我试图编写代码时不要笨拙,也不需要编写不可读的多行lambda。

public class StreamTest {

    public static void main(String[] args) {
        List<String> list = Arrays.asList("hellow", "world");
        Stream<String> stream = list.stream().map(StreamTest::exceptionThrowingMappingFunction);

    }

    public static String exceptionThrowingMappingFunction(String s) throws Exception {
        if (s.equals("world")) {
            throw new Exception("world is doomed");
        }
        return s + " exists";
    }
}

我想提供以下选项:

  1. 如果引发异常,则使整个流失败
  2. 跳过值,并在发生异常的情况下继续处理流的其余部分

我知道处理此问题的常用方法,例如在自定义FunctionalInterface中抛出RuntimeException或仅内联处理异常。

但是有某种方法,我可以扩展Streams并像StreamWithExceptionHandling这样编写Streams扩展Stream。哪个也接受ExceptionHandler并仅实现上述行为?

感谢您抽出宝贵的时间阅读此文章。

java exception stream java-stream
1个回答
0
投票

尝试编写示例解决方案并将其发布到Code Review。您的问题可能很合适。

Lambda可用于一种衬纸。其余的:不要为定义类或方法而感到难过。

对于选项2,将值映射到包含操作状态和返回值的结果对象,然后按状态过滤。您将避免在流API中引入非标准行为。


0
投票

您可以使用CompletedFuture轻松实现第二种方法,可以将RuntimeException扔给不需要处理的任何项目

public static String exceptionThrowingMappingFunction(String s) {
    if (s.equals("world")) {
        throw new RuntimeException("world is doomed");
    }
    return s + " exists";
}

然后使用CompletedFuture处理该异常

list.stream().map(s->CompletableFuture.completedFuture(exceptionThrowingMappingFunction(s)))
                 .filter(complete->!complete.isCompletedExceptionally())
                 .map(CompletableFuture::join)
                 .collect(Collectors.toList());
© www.soinside.com 2019 - 2024. All rights reserved.