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

在传递给Java8流的映射函数中,实现检查异常处理的更好方法是什么,java,exception,stream,java-stream,Java,Exception,Stream,Java Stream,我有一个简单的场景,我试图在不笨拙的情况下编写代码,也不编写不可读的多行lambda public class StreamTest { public static void main(String[] args) { List<String> list = Arrays.asList("hellow", "world"); Stream<String> stream = list.stream().map(StreamTest:

我有一个简单的场景,我试图在不笨拙的情况下编写代码,也不编写不可读的多行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";
    }
}
公共类StreamTest{
公共静态void main(字符串[]args){
List=Arrays.asList(“hellow”、“world”);
Stream Stream=list.Stream().map(StreamTest::rowingMappingFunction除外);
}
公共静态字符串异常RowingMappingFunction(字符串s)引发异常{
如果(s.equals(“世界”)){
抛出新的异常(“世界末日”);
}
返回s+“存在”;
}
}
我想要的是以下选项:

  • 如果引发异常,则使整个流失败
  • 跳过该值,如果发生异常,继续与流的其余部分
  • 我知道处理这个问题的常用方法,比如在自定义功能接口中抛出RuntimeException,或者只是内联处理异常

    但是否有某种方法可以扩展流,并编写类似StreamWithExceptionHandlingExtendstream的流。哪一个也接受ExceptionHandler并只实现上述行为


    感谢您花时间阅读此文章。

    尝试编写一个示例解决方案并将其发布到代码审阅。你的问题可能很合适

    lambda对于单行程序很有用。对于其他方面:不要为仅仅定义一个类或方法而感到难过


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

    尝试编写一个示例解决方案并将其发布到代码审阅。你的问题可能很合适

    lambda对于单行程序很有用。对于其他方面:不要为仅仅定义一个类或方法而感到难过


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

    在此场景中,您可以使用CompletionStages提供帮助。它们具有处理异常流的良好接口

    因此,作为流中的映射步骤,将流化值转换为已完成的CompletableFuture,然后将其再次映射到CompletionStage.thenApply,它将返回一个新的CompletionStage,其中包含所有异常。然后,您可以从流中过滤出不需要的异常完成阶段,或者如果需要,可以包括其他处理步骤(例如,记录异常)

    当然,您可以很容易地将值从CompletionStage映射回实际完成的值


    至少这是一种方法,而不需要编写自己的streams接口。

    在这种情况下,您可以使用CompletionStages来提供帮助。它们具有处理异常流的良好接口

    因此,作为流中的映射步骤,将流化值转换为已完成的CompletableFuture,然后将其再次映射到CompletionStage.thenApply,它将返回一个新的CompletionStage,其中包含所有异常。然后,您可以从流中过滤出不需要的异常完成阶段,或者如果需要,可以包括其他处理步骤(例如,记录异常)

    当然,您可以很容易地将值从CompletionStage映射回实际完成的值


    这至少是一种方法,不需要尝试编写自己的streams接口。

    您正在尝试哪种方法1或2?如果不必在lambda调用中编写内联处理程序,我愿意做任何解决方案。您正在尝试哪种方法1或2?我愿意做任何解决方案,如果我不必在lambda调用中编写内联处理程序。