我有一个简单的场景,我试图编写代码时不要笨拙,也不需要编写不可读的多行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";
}
}
我想提供以下选项:
我知道处理此问题的常用方法,例如在自定义FunctionalInterface中抛出RuntimeException或仅内联处理异常。
但是有某种方法,我可以扩展Streams并像StreamWithExceptionHandling这样编写Streams扩展Stream。哪个也接受ExceptionHandler并仅实现上述行为?
感谢您抽出宝贵的时间阅读此文章。
尝试编写示例解决方案并将其发布到Code Review。您的问题可能很合适。
Lambda可用于一种衬纸。其余的:不要为定义类或方法而感到难过。
对于选项2,将值映射到包含操作状态和返回值的结果对象,然后按状态过滤。您将避免在流API中引入非标准行为。
您可以使用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());