java8 foreach 抛异常_Java Stream中的异常处理

Exception

Stream API和lambda是Java自版本8以来很大的一个特性。从那个时候开始,我们可以更多地使用函数式的语法。现在,在使用了这些语言特性一段时间之后,我们经常面临的一个问题是如何在lambda里处理checkedException。

你很可能已经知道,直接在lambda里调用抛出checkedException的方法是不行的,我们需要catch住checkedException才能让代码通过编译。简单来说,我们可以直接在lambda里try-catch住异常并封装成一个RuntimeException,也就是下面第一个例子。但是我想我们能够认同的一点是这个方法不是最优雅的。

myList.stream()

.map(item -> {

try {

return doSomething(item);

} catch (MyException e) {

throw new RuntimeException(e);

}

})

.forEach(System.out::println);

但是,Lambda里包含一大块代码会显得很笨拙,并且可读性会降低,这个观点大部分人都明白。我个人认为,这种情况应该尽量避免。如果在lambda里我们需要的代码不止一行,最好的方式是把lambda的内容抽取出来封装成一个单独的方法,然后再直接调用这个方法。对于lambda里的checkedException,一个更好的且可读性强的方式是把lambda调用的原函数使用try-catch封装一下,然后再去调用它。

myList.stream()

.map(this::trySomething)

.forEach(System.out::println);

private Item trySomething(Item item) {

try {

return doSomething(item);

} catch (MyException e) {

throw new RuntimeException(e);

}

}

这种方式至少提高了可读性,并且将异常处理分离出来了。如果想要是catch住异常然后进行处理,而不只是简单地包装成RuntimeException的话,这是个勉强可行并且可读的方案。

RuntimeException

很多场景下,你会发现大家都会用这种方式去重新把异常包装成一个RuntimeException或者一个更具体的uncheckedException。这样一来,

你可能感兴趣的:(java8,foreach,抛异常)