Lambdas中的例外:有点混乱的优雅解决方案
考虑以下用于写入文件的功能:
该方法背后的想法是,以允许用户在不同的实施方式中通过InputStream
的方法,以便writeToFile
可以被称为例如用GZIPOuputStream , SnappyOuputStream
(快速压缩)或简单的FileInputStream
。
private static void writeToFile(File file, String value,Function<OutputStream, OutputStream> writing) throws IOException{try (PrintWriter pw = new PrintWriter(new BufferedOutputStream(writing.apply(new FileOutputStream(file))))) {pw.write(value);}
}
这是一个整洁的函数,可以这样调用:
public static void main(String[] args) {try {//Write with compression//DOES NOT COMPILE!!writeToFile(new File("test"), "Hello World", GZIPOutputStream::new);//Just use the FileOutputStreamwriteToFile(new File("test"), "Hello World", i->i);}catch(IOException e){//deal with exception as you choose}
}
不幸的是,正如评论中指出的那样,它无法编译! 它之所以无法编译,是因为GZIPOutputStream
在其构造函数中引发了IOException
。 如果将IOException从lambda中抛出,然后可以在try catch块中进行处理,那将是很好的选择–但这不是lambda的工作方式:-(
实际上,这是您必须处理异常以使代码得以编译的方式:
public static void main(String[] args) {try {//Write with compression//COMPILES BUT SO UGLYwriteToFile(new File("test"), "Hello World", i -> {try {return new GZIPOutputStream(i);} catch (IOException e) {//HOW ARE WE SUPPOSED TO DEAL WITH THIS EXCEPTION??throw new AssertionError(e);}});//Just use the FileOutputStreamwriteToFile(new File("test"), "Hello World", i->i);}catch(IOException e){//deal with exception as you choose}
}
这不仅难看,而且还给您带来了如何处理IOException的尴尬问题。 在这种情况下,我们刚刚将其重新包装在AssertionError中。 有关处理这种情况的正确方法,请参阅我以前的文章 “使用异常作弊”。
但是有解决此问题的方法。 可以使用创建带有值的自定义函数来返回值并抛出Exception ,而不是使用带有值并返回值的java.util.function.Function
。 这样, writeToFile
的客户端代码writeToFile
干净了,并且可以自然地处理异常。 而且,lambda现在以它们使我们的代码更漂亮和更易于理解的方式使用。
请参阅下面的完整代码清单:
package util;import java.io.*;
import java.util.zip.GZIPOutputStream;public class LambdaExceptions {public static void main(String[] args) {try {//Write with compressionwriteToFile(new File("test"), "Hello World", GZIPOutputStream::new);//Just use the FileOutputStreamwriteToFile(new File("test"), "Hello World", i->i);}catch(IOException e){//deal with exception as you choose}}private static void writeToFile(File file, String value, ThrowingFunction<OutputStream, OutputStream, IOException> writing) throws IOException{try (PrintWriter pw = new PrintWriter(new BufferedOutputStream(writing.apply(new FileOutputStream(file))))) {pw.write(value);} }@FunctionalInterfacepublic interface ThrowingFunction<I, O, T extends Throwable> {O apply(I i) throws T;}
}
翻译自: https://www.javacodegeeks.com/2015/05/exceptions-in-lambdas-an-elegant-solution-to-a-bit-of-a-mess.html
Lambdas中的例外:有点混乱的优雅解决方案相关推荐
- lambda ::_Lambdas中的例外:有点混乱的优雅解决方案
lambda :: 考虑以下用于写入文件的功能: 该方法背后的想法是,以允许用户在不同的实施方式中通过InputStream的方法,以便writeToFile可以被称为例如用GZIPOuputStre ...
- apply筛选 pandas_Pandas中第二好用的函数 | 优雅的apply
原标题:Pandas中第二好用的函数 | 优雅的apply 这是Python数据分析实战基础的第四篇内容,也是基础系列的最后一篇,接下来就进入实战系列了.本文主要讲的是Pandas中第二好用的函数-- ...
- 基于Vue2实现的仿手机QQapp(支持对话功能,滑动删除....)—— 聊聊开发过程中踩到的一些坑与解决方案,以及个人感悟...
使用Vue2进行的仿手机QQ的webapp的制作,在ui上,参考了设计师kaokao的作品,作品由个人独立开发,源码中进行了详细的注释. 由于自己也是初学Vue2,所以注释写的不够精简,请见谅. 目前 ...
- COM:下一代微生物组技术在作物生产中的应用——局限性以及基于知识的解决方案的需求
下一代微生物组技术在作物生产中的应用--局限性以及基于知识的解决方案的需求 Next generation microbiome applications for crop production - ...
- 原生js中如果有多个onload事件解决方案
原生js中如果有多个onload事件解决方案 参考文章: (1)原生js中如果有多个onload事件解决方案 (2)https://www.cnblogs.com/happy-8090/p/11830 ...
- 树莓派中找不到/dev/video0的解决方案及RaspberryCam的使用
树莓派中找不到/dev/video0的解决方案及RaspberryCam的使用 参考文章: (1)树莓派中找不到/dev/video0的解决方案及RaspberryCam的使用 (2)https:// ...
- IOS APP 国际化 程序内切换语言实现 不重新启动系统(支持项目中stroyboard 、xib 混用。完美解决方案)
IOS APP 国际化 程序内切换语言实现 不重新启动系统(支持项目中stroyboard .xib 混用.完美解决方案) 参考文章: (1)IOS APP 国际化 程序内切换语言实现 不重新启动系统 ...
- vue数组中数据变化但是视图没有更新解决方案
vue数组中数据变化但是视图没有更新解决方案 参考文章: (1)vue数组中数据变化但是视图没有更新解决方案 (2)https://www.cnblogs.com/sufubo/p/6906261.h ...
- input中v-model和value不能同时调用时解决方案
input中v-model和value不能同时调用时解决方案 参考文章: (1)input中v-model和value不能同时调用时解决方案 (2)https://www.cnblogs.com/li ...
最新文章
- 转载:一文带你入门统计学(附资源)
- as5300g2 nas软件功能_铁威马F2-221上手:家用NAS入门首选,还支持两年换新
- elasticsearch原理_花几分钟看一下Elasticsearch原理解析与性能调优
- java解析html jsoup_2020-06-02 jsoup java解析html
- 做更好的“教练”,用对抗训练增强“知识追踪”
- QT widget窗体设置主次
- python做病毒传播的空间数据_利用4行Python代码监测每一行程序的运行时间和空间消耗...
- spring系统学习:day4--Spring工厂
- NESTEROV ACCELERATED GRADIENT AND SCALE INVARIANCE FOR ADVERSARIAL ATTACKS论文解读
- 【JavaEE】第零章(2020.03.06)模式 表 索引
- 后悔药来了?发出去的微信图文消息删除后不再显示
- Sass系统技术选型笔记(3)DB
- 从0到1构建基于Springboot+SpringCloud的微信点餐系统
- 小程序源码:全新实用工具证件照制作-多玩法安装简单
- 20210429 ---- 浅谈 视口
- python爬取b站弹幕_如何爬取B站弹幕
- centos 7和redhat 7的区别及如何安装
- 怎么在firefox 里面看维语,哈语等复杂字体的网页
- 实测FourEye免杀 vs 实战化白帽子如何学习
- 我学计算机课的方法作文,我的学习小妙招作文3篇