java 8 lambda_异常作弊– Java 8 Lambdas

java 8 lambda

异常作弊– Java 8 Lambdas

撇开关于Checked vs Runtime异常的宗教辩论,有时由于库的构造不佳,处理Checked示例会使您发疯。

考虑一下您可能要编写的以下代码片段:

public void createTempFileForKey(String key) {Map<String, File> tempFiles = new ConcurrentHashMap<>();//does not compile because it throws an IOException!!tempFiles.computeIfAbsent(key, k -> File.createTempFile(key, ".tmp"));
}

为了使其编译,您需要捕获使您留下此代码的异常:

public void createTempFileForKey(String key) {Map<String, File> tempFiles = new ConcurrentHashMap<>();tempFiles.computeIfAbsent(key, k -> {try {return File.createTempFile(key, ".tmp");}catch(IOException e) {e.printStackTrace();return null;}});
}

尽管可以编译,但是IOException已经有效地被吞没了。 应该通知此方法的用户已引发异常。

为了解决这个问题,您可以将IOException包装在通用RuntimeException中,如下所示:

public void createTempFileForKey(String key) throws RuntimeException {Map<String, File> tempFiles = new ConcurrentHashMap<>();tempFiles.computeIfAbsent(key, k -> {try {return File.createTempFile(key, ".tmp");}catch(IOException e) {throw new RuntimeException(e);}});
}

这段代码确实抛出了一个Exception,但是没有抛出打算由该代码抛出的实际IOException。 那些只支持RuntimeExceptions的人可能会对此代码感到满意,尤其是如果可以改进解决方案以创建自定义的IORuntimeException时。 尽管如此,大多数人还是以这种方式编写代码,他们希望他们的方法能够从File.createTempFile方法中抛出经过检查的IOException

这样做的自然方法有些复杂,看起来像这样:

public void createTempFileForKey(String key) throws IOException{Map<String, File> tempFiles = new ConcurrentHashMap<>();try {tempFiles.computeIfAbsent(key, k -> {try {return File.createTempFile(key, ".tmp");} catch (IOException e) {throw new RuntimeException(e);}});}catch(RuntimeException e){if(e.getCause() instanceof IOException){throw (IOException)e.getCause();}}
}

从lambda内部,您必须捕获IOException,将其包装在RuntimeException中并抛出该RuntimeException。 Lambda必须捕获RuntimeException的包装并重新抛出IOException。 确实非常丑陋!

在理想的世界中,我们需要做的就是从lambda中抛出已检查的异常,而不必更改computeIfAbsent的声明。 换句话说,抛出检查异常,就好像它是运行时异常一样。 但是不幸的是Java不允许我们这样做…

除非我们作弊,否则那不是! 这里有两种方法可以精确地执行我们想要的操作,即抛出检查异常,就好像它是运行时异常一样。

方法1 –使用泛型:

public static void main(String[] args){doThrow(new IOException());}static void doThrow(Exception e) {CheckedException.<RuntimeException> doThrow0(e);}static <E extends Exception>void doThrow0(Exception e) throws E {throw (E) e;}

请注意,我们已经创建并抛出IOException,而没有在main方法中声明它。

方法2 –使用不安全:

public static void main(String[] args){getUnsafe().throwException(new IOException());}private static Unsafe getUnsafe(){try {Field theUnsafe = Unsafe.class.getDeclaredField("theUnsafe");theUnsafe.setAccessible(true);return (Unsafe) theUnsafe.get(null);} catch (Exception e) {throw new AssertionError(e);}}

再次,我们设法抛出IOException而不在方法中声明它。

无论您喜欢哪种方法,我们现在都可以通过这种方式自由编写原始代码:

public void createTempFileForKey(String key) throws IOException{Map<String, File> tempFiles = new ConcurrentHashMap<>();tempFiles.computeIfAbsent(key, k -> {try {return File.createTempFile(key, ".tmp");} catch (IOException e) {throw doThrow(e);}});}private RuntimeException doThrow(Exception e){getUnsafe().throwException(e);return new RuntimeException();}private static Unsafe getUnsafe(){try {Field theUnsafe = Unsafe.class.getDeclaredField("theUnsafe");theUnsafe.setAccessible(true);return (Unsafe) theUnsafe.get(null);} catch (Exception e) {throw new AssertionError(e);}}

doThrow()方法显然将封装在某些实用程序类中,从而使您的代码在createTempFileForKey()非常干净。

翻译自: https://www.javacodegeeks.com/2015/05/cheating-with-exceptions-java-8-lambdas.html

java 8 lambda

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/337997.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

c语言程序的基本单位是什么呢?

点击上方蓝字关注我&#xff0c;了解更多咨询随着科技的不断发展&#xff0c;电脑等终端设备已经成为我们生活中不可或缺的工具&#xff0c;而希望学习程序设计语言的朋友也越来越多&#xff0c;那么c语言的基本单位是什么呢&#xff1f;其实&#xff0c;c语言的基本单位是函数…

困难时拉你一把的图片_人生感悟语录:最不能忘记的,是在你困难时拉你一把的人...

1、人&#xff0c;最不能忘记的&#xff0c;是在你困难时拉你一把的人;最不能结交的&#xff0c;是在你失败时藐视你的人;最不能相信的&#xff0c;是在你成功时吹捧你的人;最不能抛弃的&#xff0c;是和你同创业共患难的人;最不能爱的&#xff0c;是不看重你人格的人。2、人生…

关于C语言中的memset()函数你了解多少

点击上方蓝字关注我&#xff0c;了解更多咨询1.函数原型及功能memset()函数原型为&#xff1a;函数功能&#xff1a;将_Dst所指区域的前size_t个字节均初始化为_val&#xff0c;调用时需要引用string.h头文件memset()函数多用于数组和结构体这种占用内存比较大的数据结构的初始…

如何判断无法到达目标的拼图_拼图项目的动机和目标

如何判断无法到达目标的拼图几周前&#xff0c;我写了一篇关于Jigsaw项目可能如何破坏现有代码的文章 。 那么我们得到什么回报呢&#xff1f; 让我们看一下项目解决的痛点及其在Java 9中解决问题的目标。 系列 这篇文章是正在进行的有关拼图项目系列的一部分。 按照推荐的顺序…

deepin下载python_深度操作系统中怎样下载python?

需要以下4步&#xff1a;1、下载 2、获取权限 3、安装 4 、运行测试注意&#xff1a;千万不要卸载或者强制卸载原来自带的python&#xff0c;具体原因请看度娘的介绍&#xff01;1、下载Python3.7.6&#xff1a;到官网下载https://www.python.org&#xff0c;在downloads中可以…

javafx显示image_JavaFX技巧20:有很多要显示的吗? 使用画布!

javafx显示imageJavaFX应用程序似乎有两种&#xff1a;第一种使用带有节点和CSS样式的场景图&#xff0c;第二种使用单个画布。 但是&#xff0c;将这两种方法混合使用是完全合法的。 尤其是当您的应用程序必须显示大量详细信息时&#xff0c;您很容易最终创建成千上万个节点。…

c语言中|的含义

点击上方蓝字关注我&#xff0c;了解更多咨询||在c语言中的意思是逻辑OR&#xff08;或&#xff09;运算&#xff0c;运算符两端有一个变量为真&#xff0c;则结果为真。比如a||b表示a和b做逻辑OR&#xff08;或&#xff09;运算&#xff0c;只要有任何一个变量为“真”&#x…

30 校准_校准or质控,傻傻分不清楚

今天发个福利&#xff0c;应kkz的要求&#xff0c;聊一聊我对IVD校准和质控的个人理解。非专业科普文&#xff0c;欢迎交流&#xff5e;先来讲个小故事&#xff1a;我小的时候&#xff0c;家里用的挂钟每隔一段时间就要调准一下。那个时候没有网络&#xff0c;爸妈是对着中央新…

jax-ws 生成soap_在Spring中记录JAX-WS SOAP消息

jax-ws 生成soap每当在Spring中使用JAX-WS时&#xff0c;您可能都希望记录传入和传出的SOAP消息-如果仅用于开发过程中的调试。 因此&#xff0c;第一件事就是增加日志级别&#xff0c;对吗&#xff1f; 不幸的是&#xff0c;这将无效。 您将要做的是利用javax.xml.ws.handler.…

C语言查找数组最大最小值

点击上方蓝字关注我&#xff0c;了解更多咨询C语言查询最大最小值的实现思路&#xff1a;定一个变量存储最大值或最小值&#xff0c;变量的初始值取自数组的第一个元素&#xff0c;然后遍历数组&#xff0c;如果遍历到的元素比变量的值大&#xff0c;就把值赋给变量&#xff0c…

c语言中%s的含义你知道吗?

点击上方蓝字关注我&#xff0c;了解更多咨询%s在C语言中代表字符串型格式符&#xff0c;一般用在printf、sprintf等字符串格式化函数中&#xff0c;用于决定格式化参数的数据类型。整数类型是%d,单精度浮点类型&#xff0c;也就是小数是%f,字符类型%c%c&#xff0c;%s这些代表…

mysql 1千万 like优化_MYSQL千万级数据量的优化方法积累

1、分库分表很明显&#xff0c;一个主表(也就是很重要的表&#xff0c;例如用户表)无限制的增长势必严重影响性能&#xff0c;分库与分表是一个很不错的解决途径&#xff0c;也就是性能优化途径&#xff0c;现在的案例是我们有一个1000多万条记录的用户表members,查询起来非常之…

1.0jpa 2.0_JPA 2.1如何成为新的EJB 2.0

1.0jpa 2.0美丽在于情人眼中。 “轻松”也是如此&#xff1a; 了解有关SQL结果集映射的更多信息&#xff0c;并轻松处理本机查询结果&#xff1a; http : //t.co/WH4BTlClIP #JPA #Java #JavaEE — Thorben Janssen&#xff08; thjanssen123&#xff09; 2015年4月15日 Tho…

C语言while循环要点你会吗

点击上方蓝字关注我&#xff0c;了解更多咨询while语句在使用过程需要注意几个要点&#xff1a;一、无限循环先来看看以下的代码示例int n 0;while(n<3)printf("n %d", n);n;执行代码后&#xff0c;循环输出n0。在上述代码中&#xff0c;虽然有n自增&#xff0c…

mysql performance tuning_MySQL Performance tuning

1.表级锁状态mysql> show status like table%;---------------------------------------| Variable_name | Value |---------------------------------------| Table_locks_immediate | 139306577 || Table_locks_waited | 0 || Tabl…

序列化加密字段_自动加密可序列化的类

序列化加密字段在Coursera安全顶峰项目的验尸讨论中提出了一个疯狂的想法。 类可以在序列化期间自行加密吗&#xff1f; 这主要是学术上的“假设”练习。 很难想到这样一种情况&#xff0c;我们希望在持久性期间依靠对象自加密而不是使用显式加密机制。 我只能确定一种情况&am…

C语言if与else匹配规则你知道多少?

点击上方蓝字关注我&#xff0c;了解更多咨询如果程序中有多个if和else&#xff0c;那如何配对&#xff0c;if和else的匹配规则简单总结为以下两点&#xff1a;1.无花括号&#xff0c;else和最近的if匹配2.有花括号&#xff0c;else和内含有if语句的第1个if语句匹配我们通过两个…

cobertura_Cobertura和Sonar 5.1的问题

cobertura最近&#xff0c;我有些麻烦&#xff0c;试图在我的Grails 2.4.4项目中使用Sonar 5.1。 我使用的是Groovy常用的东西&#xff1a; Gmetrics&#xff0c;Codenarc和Cobertura 。 对于Sonar数据库&#xff0c;我使用的是Postgres 9.4 。 声纳跑步者的日志文件给了我这个…

C语言中+=的含义你明白吗?

点击上方蓝字关注我&#xff0c;了解更多咨询c语言中是代表两个变量相加&#xff0c;并将答案记录在左边的变量里。比如xy实际代表的表达式为&#xff1a;xxy。这是c语言为了语言的简洁性推出的组合运算。常见的运算符都可以这样组合运算。一、源码演示&#xff1a;二、输出结果…

calcite mysql_Apache顶级项目 Calcite使用介绍

原标题&#xff1a;Apache顶级项目 Calcite使用介绍什么是CalciteApache Calcite是一个动态数据管理框架&#xff0c;它具备很多典型数据库管理系统的功能&#xff0c;比如SQL解析、SQL校验、SQL查询优化、SQL生成以及数据连接查询等&#xff0c;但是又省略了一些关键的功能&am…