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

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

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

相关文章

linux ub查看ftp安装,Linux Ubuntu 18.04 安装 FTP服务

安装更新数据源 : apt-get update安装FTP: sudo apt-get install vsftpd服务启动FTP服务: sudo service vsftpd startTip可以使用screen后台运行服务停止FTP服务: sudo service vsftpd stop查看FTP服务状态: sudo service vsftpd status配置新建用户新建/home/uftp目录作为用户…

图片上的文字怎么转换为word

图片上的文字怎么转换为word 很多软件因为自身技术不成熟所有对使用环境操作步骤等有诸多的要求&#xff0c;使得用户使用的时候很不方便。一般的ocr文字识别软件不能在win7系统中使用&#xff0c;有的时候要使用这个软件还要重装系统或是找一台xp系统的电脑&#xff0c;使用受…

【APICloud系列|2】上架安卓应用商店全套流程(小米应用商店、华为应用市场、阿里应用商店、百度手机助手、腾讯应用宝)

​​本次主要讲解前5个平台上架流程及注意事项(注册登录信息自行准备) 1. 腾讯应用宝:http://open.qq.com/ 2. 阿里应用商店(淘宝手机助手,UC应用商店,豌豆荚):http://open.uc.cn/ 3. 百度手机助手:http://app.baidu.com/ 4. 华为应用市场:http://developer.huaw…

socket阻塞与非阻塞,同步与异步、I/O模型

socket阻塞与非阻塞&#xff0c;同步与异步 1. 概念理解 在进行网络编程时&#xff0c;我们常常见到同步(Sync)/异步(Async)&#xff0c;阻塞(Block)/非阻塞(Unblock)四种调用方式&#xff1a;同步&#xff1a; 所谓同步&#xff0c;就是在发出一个功能调用时&#xff0c;…

linux基于域名的虚拟主机,Nginx虚拟主机应用——基于域名、IP、端口的虚拟主机...

Nginx支持的虚拟主机有三种●基于域名的虚拟主机●基于IP的虚拟主机●基于端口的虚拟主机每一种虚拟主机均可通过“server{}" 配置段实现各自的功能基于域名的虚拟主机实验环境1.基础源码包(无密码):https://pan.baidu.com/s/14WvcmNMC6CFX1SnjHxE7JQ2.CentOS 7版本Linux虚…

解决Chrome谷歌浏览器″Adobe Flash Player 插件已被屏蔽″的问题

​​解决Chrome谷歌浏览器"Adobe Flash Player 插件已被屏蔽"的问题如果你确定在电脑上确实已经安装了 Adobe Flash Player 插件&#xff0c;但是打开网页时仍然提示"已屏蔽 Adobe Flash Player 插件" &#xff0c;你可以试试修改下面这两个选项&#xff0…

powermock模拟对象_使用PowerMock测试对象的内部状态

powermock模拟对象大多数单元测试都集中于测试对象的行为以证明其有效。 这可以通过编写一个JUnit测试来实现&#xff0c;该测试调用对象的公共方法&#xff0c;然后测试这些调用的返回值是否与先前定义的一组期望值匹配。 这是一种非常常见且成功的技术。 但是&#xff0c;不应…

Mono for android,Xamarin点击事件的多种写法

&#xff08;一&#xff09;原本java的写法&#xff08;相信很多是学过java的&#xff09;&#xff1a; 需要实现接口View.IOnClickListener&#xff0c;最好也继承类&#xff1a;Activity&#xff0c;因为View.IOnClickListener接口又继承了IJavaObject, IDisposable接口&…

51个赚钱的好方法

有很多方法赚钱。你可以在家工作&#xff0c;你可以做各种自由职业者&#xff0c;你可以在博客&#xff0c;也可以只保存。时间紧迫&#xff0c;我不知道任何人谁不喜欢做一些额外的现金。所以&#xff0c;我得给你51如何赚钱最好的方法的列表。 1.作为自由职业者的工作 工作作…

一句话木马绕过linux安全模式,一句话木马(webshell)是如何执行命令的

在很多的渗透过程中&#xff0c;渗透人员会上传一句话木马(简称webshell)到目前web服务目录继而提权获取系统权限&#xff0c;不论asp、php、jsp、aspx都是如此&#xff0c;那么一句话木马到底是如何执行的呢&#xff0c;下面我们就对webshell进行一个简单的分析。首先我们先看…

如何从finally块访问方法的结果值

尽管JVM是基于堆栈的计算机 &#xff0c;但Java语言实际上并没有为您提供任何访问该堆栈的方法。 即使有时&#xff0c;在极少数情况下&#xff0c;它也会非常有用。 一个例子 方法结果值放在堆栈中。 如果查看以下示例&#xff1a; public int method() {if (something)retu…

第六章 Qt布局管理器Layout

第六章 Qt布局管理器Layout 大家有没有发现一个现象&#xff0c;我们放置一个组件&#xff0c;给组件最原始的定位是给出这个控件的坐标和宽高值&#xff0c;这样Qt就知道这个组件的位置。当用户改变窗口的大小&#xff0c;组件还静静地呆在原来的位置&#xff0c;这有时候显然…

kafka集群状态Linux,Kafka集群配置

本文只要讲述Kafka集群的配置事项&#xff0c;包括zookeeper集群的配置。本文讲述的前提是kafka和zookeeper在单机情况下已正确安装和配置。如有疑问&#xff0c;可以参考《Linux(CentOS)中常用软件安装&#xff0c;使用及异常——Zookeeper, Kafka》。假设集群中有三台机器, i…

【APICloud系列|36】小米应用商店可以检测同个应用不同版本信息

在小米应用商店上架的信息 在其他应用商店上架的信息&#xff0c;比如应用宝 小米发过来的友好提示邮件&#xff1a;

VLAN的Hybrid和Trunk端口有何区别

有网友问这样一个问题&#xff1a; vlan 1 vlan 2 vlan 3 vlan 4 vlan 5 interface Ethernet0/1 port link-type hybrid port hybrid vlan 1 to 4 untagged port hybrid pvid vlan 2 interface Ethernet0/2 port link-type hybrid port hybrid vlan 3 to 5 untagged port hybri…

【APICloud系列|35】小米应用商店版本更新

1.在小米应用商店后天重新上传一个更新加固已经签名的安装包。 链接地址&#xff1a;https://dev.mi.com 2.完善资料&#xff0c;只需要填写更新日志简单说明更新的缘由&#xff0c;再次选择相应的语言即可。原来的内容还是存在的。 3.提交审核就行。

Linux光盘检测,qpxtool

软件简介各位使用Linux系统的刻录发烧友有福了。不用再为了检测光碟品质而切换到Windows系统了。因为在Linux系统里也有支持光碟品质检测的软件&#xff01;它的名字是QPxTool。虽说05年底QPxTool就诞生了&#xff0c;但最近才被以rpm包的形式提供给Fedora用户。首先看下它的界…

eclipse中tomcat能正常启动,在浏览器中不能打开问题

问题原因&#xff1a;没有在eclipse中tomcat的server location设置到tomcat的安装目录。 解决办法&#xff1a;1、选择server点击右键&#xff0c;选择Open选项&#xff0c;然后在server location栏设置tomcat的安装目录。 2、重新启动tomcat server。 3、在浏览器中输入&#…

存根类 测试代码 java_为旧版代码创建存根-测试技术6

存根类 测试代码 java任何阅读此博客的人都可能已经意识到&#xff0c;目前我正在开发一个项目&#xff0c;其中包含大量的旧代码&#xff0c;这些旧代码庞大&#xff0c;扩展且编写时从未进行过任何测试。 在使用此遗留代码时&#xff0c;有一个行为非常差的类非常普遍&#…

百度开发平台提交应用后进行官方认证审核失败?

昨晚收到一封来自百度的邮件 这里需要登录工业和信息化部查询后的ICP备案后的详细页面截图。&#xff08;其实也可以在备案的平台查询相关信息&#xff0c;我的是在阿里云备案的&#xff0c;所以直接去阿里云比较方便快捷&#xff09; 然后直接上传营业执照副本、ICP备案截图、…