考虑以下用于写入文件的功能:

该方法背后的想法是,以允许用户在不同的实施方式中通过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中的例外:有点混乱的优雅解决方案相关推荐

  1. lambda ::_Lambdas中的例外:有点混乱的优雅解决方案

    lambda :: 考虑以下用于写入文件的功能: 该方法背后的想法是,以允许用户在不同的实施方式中通过InputStream的方法,以便writeToFile可以被称为例如用GZIPOuputStre ...

  2. apply筛选 pandas_Pandas中第二好用的函数 | 优雅的apply

    原标题:Pandas中第二好用的函数 | 优雅的apply 这是Python数据分析实战基础的第四篇内容,也是基础系列的最后一篇,接下来就进入实战系列了.本文主要讲的是Pandas中第二好用的函数-- ...

  3. 基于Vue2实现的仿手机QQapp(支持对话功能,滑动删除....)—— 聊聊开发过程中踩到的一些坑与解决方案,以及个人感悟...

    使用Vue2进行的仿手机QQ的webapp的制作,在ui上,参考了设计师kaokao的作品,作品由个人独立开发,源码中进行了详细的注释. 由于自己也是初学Vue2,所以注释写的不够精简,请见谅. 目前 ...

  4. COM:下一代微生物组技术在作物生产中的应用——局限性以及基于知识的解决方案的需求

    下一代微生物组技术在作物生产中的应用--局限性以及基于知识的解决方案的需求 Next generation microbiome applications for crop production - ...

  5. 原生js中如果有多个onload事件解决方案

    原生js中如果有多个onload事件解决方案 参考文章: (1)原生js中如果有多个onload事件解决方案 (2)https://www.cnblogs.com/happy-8090/p/11830 ...

  6. 树莓派中找不到/dev/video0的解决方案及RaspberryCam的使用

    树莓派中找不到/dev/video0的解决方案及RaspberryCam的使用 参考文章: (1)树莓派中找不到/dev/video0的解决方案及RaspberryCam的使用 (2)https:// ...

  7. IOS APP 国际化 程序内切换语言实现 不重新启动系统(支持项目中stroyboard 、xib 混用。完美解决方案)

    IOS APP 国际化 程序内切换语言实现 不重新启动系统(支持项目中stroyboard .xib 混用.完美解决方案) 参考文章: (1)IOS APP 国际化 程序内切换语言实现 不重新启动系统 ...

  8. vue数组中数据变化但是视图没有更新解决方案

    vue数组中数据变化但是视图没有更新解决方案 参考文章: (1)vue数组中数据变化但是视图没有更新解决方案 (2)https://www.cnblogs.com/sufubo/p/6906261.h ...

  9. input中v-model和value不能同时调用时解决方案

    input中v-model和value不能同时调用时解决方案 参考文章: (1)input中v-model和value不能同时调用时解决方案 (2)https://www.cnblogs.com/li ...

最新文章

  1. 转载:一文带你入门统计学(附资源)
  2. as5300g2 nas软件功能_铁威马F2-221上手:家用NAS入门首选,还支持两年换新
  3. elasticsearch原理_花几分钟看一下Elasticsearch原理解析与性能调优
  4. java解析html jsoup_2020-06-02 jsoup java解析html
  5. 做更好的“教练”,用对抗训练增强“知识追踪”
  6. QT widget窗体设置主次
  7. python做病毒传播的空间数据_利用4行Python代码监测每一行程序的运行时间和空间消耗...
  8. spring系统学习:day4--Spring工厂
  9. NESTEROV ACCELERATED GRADIENT AND SCALE INVARIANCE FOR ADVERSARIAL ATTACKS论文解读
  10. 【JavaEE】第零章(2020.03.06)模式 表 索引
  11. 后悔药来了?发出去的微信图文消息删除后不再显示
  12. Sass系统技术选型笔记(3)DB
  13. 从0到1构建基于Springboot+SpringCloud的微信点餐系统
  14. 小程序源码:全新实用工具证件照制作-多玩法安装简单
  15. 20210429 ---- 浅谈 视口
  16. python爬取b站弹幕_如何爬取B站弹幕
  17. centos 7和redhat 7的区别及如何安装
  18. 怎么在firefox 里面看维语,哈语等复杂字体的网页
  19. 实测FourEye免杀 vs 实战化白帽子如何学习
  20. 我学计算机课的方法作文,我的学习小妙招作文3篇

热门文章

  1. 使用java中的String类操作复杂的字符串
  2. 使用spring实现邮件的发送(含测试,源码,注释)
  3. hibernate+struts2整合jar包冲突
  4. 2019蓝桥杯省赛---java---C---6(旋转)
  5. Spring配置文件约束头
  6. 西瓜显示服务器错误,西瓜云服务器
  7. ddm模型公式_简单判断目前行情——从股利贴现模型切入
  8. OkHttp上传Json嵌套对象
  9. python数据分析架构_Python数据分析
  10. (转)mysql查看连接客户端ip和杀死进程