JAVA研发狄仁杰 5万字:Stream和Lambda表达式最佳实践2
7.2处理checkedException
checkedException是必须要处理的异常 , 我们还是看个例子:staticvoidthrowIOException(Integerinteger)throwsIOException{}复制代码List
integers=Arrays.asList(1,2,3,4,5);integers.forEach(i->throwIOException(i));复制代码
上面我们定义了一个方法抛出IOException , 这是一个checkedException , 需要被处理 , 所以在下面的forEach中 , 程序会编译失败 , 因为没有处理相应的异常 。
最简单的办法就是try , catch住 , 如下所示:integers.forEach(i->{try{throwIOException(i);}catch(IOExceptione){thrownewRuntimeException(e);}});复制代码
当然 , 这样的做法的坏处我们在上面已经讲过了 , 同样的 , 我们可以定义一个新的wrapper方法:staticConsumerconsumerWrapper(ThrowingConsumer
throwingConsumer){returni->{try{throwingConsumer.accept(i);}catch(Exceptionex){thrownewRuntimeException(ex);}};}复制代码
我们这样调用:integers.forEach(consumerWrapper(i->throwIOException(i)));复制代码
我们也可以封装一下异常:static
ConsumerconsumerWrapperWithExceptionClass(ThrowingConsumer
throwingConsumer,Class
{try{throwingConsumer.accept(i);}catch(Exceptionex){try{EexCast=exceptionClass.cast(ex);System.err.println("Exceptionoccured:"+exCast.getMessage());}catch(ClassCastExceptionccEx){thrownewRuntimeException(ex);}}};}复制代码
然后这样调用:integers.forEach(consumerWrapperWithExceptionClass(i->throwIOException(i),IOException.class));复制代码8.stream中throwException
之前的文章我们讲到 , 在stream中处理异常 , 需要将checkedexception转换为uncheckedexception来处理 。
我们是这样做的:staticConsumerconsumerWrapper(ThrowingConsumer
throwingConsumer){returni->{try{throwingConsumer.accept(i);}catch(Exceptionex){thrownewRuntimeException(ex);}};}复制代码
将异常捕获 , 然后封装成为RuntimeException 。
封装成RuntimeException感觉总是有那么一点点问题 , 那么有没有什么更好的办法?8.1throw小诀窍
java的类型推断大家应该都知道 , 如果是这样的形式 , 那么T将会被认为是RuntimeException!
我们看下例子:publicclassRethrowException{publicstatic
RthrowException(Exceptiont)throwsT{throw(T)t;//justthrowit,convertcheckedexceptiontouncheckedexception}}复制代码
上面的类中 , 我们定义了一个throwException方法 , 接收一个Exception参数 , 将其转换为T , 这里的T就是uncheckedexception 。
接下来看下具体的使用:@Slf4jpublicclassRethrowUsage{publicstaticvoidmain(String[]args){try{throwIOException();}catch(IOExceptione){log.error(e.getMessage(),e);RethrowException.throwException(e);}}staticvoidthrowIOException()throwsIOException{thrownewIOException("ioexception");}}复制代码
上面的例子中 , 我们将一个IOException转换成了一个uncheckedexception 。 9.stream中Collectors的用法
在javastream中 , 我们通常需要将处理后的stream转换成集合类 , 这个时候就需要用到stream.collect方法 。 collect方法需要传入一个Collector类型 , 要实现Collector还是很麻烦的 , 需要实现好几个接口 。
于是java提供了更简单的Collectors工具类来方便我们构建Collector 。
下面我们将会具体讲解Collectors的用法 。
假如我们有这样两个list:List
list=Arrays.asList("jack","bob","alice","mark");List
推荐阅读
- 检测|辽宁派16支核酸检测医疗队驰援大连,研发10合1混采技术
- 车家号|起亚能否依靠电动化迎来转机?,布局未来研发纯电动SUV
- 辽宁:派出16支核酸检测医疗队驰援大连 创新研发10合1混采检测技术
- Galaxy|Galaxy Note 20首发!三星研发全新UWP技术:传输速度比NFC更快
- 科技创新板|康希诺港股涨幅高达1190.5%,如今登陆A股募集10亿用于疫苗研发
- 北斗|中国自主研发的北斗卫星 “心脏”精度:每三百万年差1秒
- 采埃孚|变速箱巨头采埃孚不再研发内燃机部件:将聚焦于插混和纯电驱动单元
- 县域|百强县上市公司研发投入创新高 中部崛起趋势明显
- 引领先锋|Java工程师福利!1分钟学会使用Aspose.PDF将PDF转换为PPT / PPTX
- 移动网络亚洲首富重磅官宣!获美科技巨头千亿元投资:成功研发出顶级5G技术