lambda ::

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

该方法背后的想法是,以允许用户在不同的实施方式中通过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

lambda ::

lambda ::_Lambdas中的例外:有点混乱的优雅解决方案相关推荐

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

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

  2. python大于等于怎么表示_如何在rejectdb中应用python lambda表达式中的大于等于

    我在reinstdb表中有下面的json记录.在[{ "pid": 12, "sk": [ { "sid": 30, "et&qu ...

  3. Java forEach中 Lambda Expr中的 final变量要求

    https://my.oschina.net/wadelau/blog/1859419 Java forEach中 Lambda Expr中的 final变量要求 Java8闭包 闭包是一个函数在创建 ...

  4. lambda 表达式中的 this 与普通情况下的 this 指向

    lambda 表达式中的 this 与普通情况下的 this 指向 Java JavaScript this 绑定 总结与提醒   很多编程语言都支持 lambda 表达式,不过对于不同编程语言,其 ...

  5. java 8 lambda表达式中的异常处理

    文章目录 简介 处理Unchecked Exception 处理checked Exception 总结 java 8 lambda表达式中的异常处理 简介 java 8中引入了lambda表达式,l ...

  6. java lambda 表达式中的双冒号和箭头的用法 ::

    先构造一些数据,创建一个User类 java lambda 表达式中的双冒号的用法 :: 双冒号运算就是Java中的[方法引用],[方法引用]的格式是 类名::方法名 如下图所示 User是一个类, ...

  7. java lambda 两个冒号_java lambda 表达式中的双冒号的用法说明 ::

    双冒号运算就是java中的[方法引用],[方法引用]的格式是 类名::方法名 注意是方法名哦,后面没有括号"()"哒.为啥不要括号,因为这样的是式子并不代表一定会调用这个方法.这种 ...

  8. 编译器说 Lambda 表达式中的变量必须是 final 的,我偏不信 | 原力计划

    作者 | 沉默王二 来源 | CSDN博客专家 出品 | CSDN(ID:CSDNnews) 偶尔,我们需要在 Lambda 表达式中修改变量的值,但如果直接尝试修改的话,编译器不会视而不见听而不闻, ...

  9. 无状态编程, lambda 表达式中传入的局部变量,为什么需要是不可变的(final)

    无状态编程 说明 @author JellyfishMIX - github / blog.jellyfishmix.com LICENSE GPL-2.0 前言 本文将会根据以下顺序进行叙述: la ...

最新文章

  1. 对话框属性页(VC_MFC)
  2. 无人车时代:用深度学习辅助行人检测
  3. 利用SOS分析调试托管代码--(1)
  4. visual studio code 修改工具栏风格
  5. java校验框架源码解析_Spring Boot原理剖析和源码分析
  6. Python使用正则表达式分割字符串
  7. Java锁的种类以及辨析
  8. Spring – IoC 容器
  9. matplotlib无法显示图片的解决方法(non-gui backend)
  10. php 双向队列,php实现的双向队列类实例
  11. 老程序员被裁员,面试半年未果,同行:都四十了还是码农,怪谁?
  12. 我的世界联机被拒绝可能原因
  13. Js 生成uuid的四种方法
  14. C# 项目实战(经典)
  15. 办公室计算机知识考试试题,办公室人员电脑操作基本技能方面测试题--绝对经典...
  16. 【深度学习21天学习挑战赛】备忘篇: from_tensor_slices的作用和用法
  17. 人在深圳的100怕!——谨以此文献给所有的深圳打拼者
  18. Javascript(十三)javascript BOM详解
  19. 4.6有一个函数。 写程序,输入x的值,输出相应的y值
  20. 在使用123作为rand matlab,西安电子科技大学MATLAB考试试卷

热门文章

  1. P2179-[NOI2012]骑行川藏【导数,二分】
  2. 欢乐纪中某A组赛【2019.7.12】
  3. POJ1179,P4342-[IOI1998]Polygon【区间dp】
  4. 【prim】【最小生成树】最优布线问题(ssl 1612)
  5. 【DP】小明在边塞(jzoj 2147)
  6. JavaFX 2.1:Toolkit not initialized
  7. JavaFX官方教程(十)之转换类型和示例
  8. 对于这款APP,我充了个终身VIP!!!
  9. 你想象中的实习是什么样的?
  10. ssh(Spring+Spring mvc+hibernate)——DeptServiceImpl.java