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

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 ::

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

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

相关文章

​常问的16个C语言问题,你能答上来几个?

点击蓝字关注我们最近不少小伙伴在找工作&#xff0c;这里我给大家分享一下面试中经常会遇到的一些嵌入式C语言问题&#xff0c;你看看能答上来几个呢&#xff1f;1用预处理指令#define 声明一个常数&#xff0c;用以表明1年中有多少秒&#xff08;忽略闰年问题&#xff09;#de…

centos linux 内核升级,Centos系统的升级及Linux 内核升级

系统及内核版本&#xff1a;[rootnode5 ~]# cat /etc/redhat-releaseCentOS Linux release 7.3.1611 (Core)[rootnode5 ~]# uname -aLinux node6 3.10.0-514.el7.x86_64 #1 SMP Tue Nov 22 16:42:41 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux更新仓库&#xff1a;[rootnode5 yu…

spring javaee_JavaEE还是Spring? 都不行! 我们呼吁新的竞争者!

spring javaee如果您一直在Twitter上关注一些Java的重要人物&#xff0c;或者在Reddit上阅读了“新闻”&#xff0c;那么您一定不会错过Spring和JavaEE宣传人员之间热闹的“贱人之战”&#xff08;请原谅我的法语&#xff09;。 首先&#xff0c;于尔根霍勒&#xff08;JrgenH…

C语言代码优化的方法

点击蓝字关注我们在本篇文章中&#xff0c;我(指原作者)收集了很多经验和方法。应用这些经验和方法&#xff0c;可以帮助我们从执行速度和内存使用等方面来优化C语言代码。简介在最近的一个项目中&#xff0c;我们需要开发一个运行在移动设备上但不保证图像高质量的轻量级JPEG库…

linux源码安装apache2,CentOS7编译安装Apache2

在LAMP环境下对于服务的安装是必不可少的&#xff0c;在linux环境下安装软件也有两种不同的方式&#xff0c;一种是yum安装当然了不同的linux发行版本使用略有不同&#xff0c;另一种是通过编译安装&#xff0c;编译安装要比yum安装要可控此&#xff0c;但是要比yum安装略微麻烦…

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

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

C/C++ 命中率比较高的面试知识点,你都答得上来吗

点击蓝字关注我们第一部分&#xff1a;计算机基础1. C/C内存有哪几种类型&#xff1f;C中&#xff0c;内存分为5个区&#xff1a;堆(malloc)、栈(如局部变量、函数参数)、程序代码区&#xff08;存放二进制代码&#xff09;、全局/静态存储区&#xff08;全局变量、static变量&…

linux 提示符 异常,linux终端提示符异常 bash-4.1$

/etc/profile: 此文件为系统的每个用户设置环境信息,当用户第一次登录时,该文件被执行.并从/etc/profile.d目录的配置文件中搜集shell的设置./etc/bashrc: 为每一个运行bash shell的用户执行此文件.当bash shell被打开时,该文件被读取.~/.bash_profile: 每个用户都可使用该文件…

svn: 没有演进历程信息_使用默认方法的接口演进–第二部分:接口

svn: 没有演进历程信息引入了默认方法以启用接口演进。 如果向后兼容性是不可替代的&#xff0c;则仅限于向接口添加新方法&#xff08;这是它们在JDK中的唯一用法&#xff09;。 但是&#xff0c;如果希望客户端更新其代码&#xff0c;则可以使用默认方法逐步演化接口而不会引…

蓝桥杯7届c语言 c组答案,第七届蓝桥杯C语言C组-(自己懂的题目)

第七届蓝桥杯C语言C组-(自己懂的题目)表示刚刚查了成绩&#xff0c;省赛一等奖&#xff0c;有资格去北京了&#xff0c;然后写一下总结&#xff0c;先来写一下我懂的题目&#xff0c;毕竟我也是菜鸟&#xff0c;听说国赛比预赛难几个等级。。。第一题报纸页数X星球日报和我们地…

关于多线程的几道面试题

点击蓝字关注我们第一题&#xff1a;线程的基本概念、线程的基本状态及状态之间的关系&#xff1f;线程&#xff0c;有时称为轻量级进程&#xff0c;是CPU使用的基本单元&#xff1b;它由线程ID、程序计数器、寄存器集合和堆栈组成。它与属于同一进程的其他线程共享其代码段、数…

c语言 想输入非数字是报错误,C语言上机练习5C言上机练习5.doc

C语言上机练习5C言上机练习5C语言上机报告5 数组2上机内容找出下列程序中的错误并改正1) /*有一个34的矩阵,要求输出其中值最大的元素的值,以及它的行号和列号。*/#include "stdio.h"#define M 3//无分号#define N 4void main( ){ int max,i,j,r,c;int a[M][N]{{323…

大牛谈嵌入式C语言的高级用法

点击蓝字关注我们内存管理我们需要知道——变量&#xff0c;其实是内存地址的一个抽像名字罢了。在静态编译的程序中&#xff0c;所有的变量名都会在编译时被转成内存地址。机器是不知道我们取的名字的&#xff0c;只知道地址。 内存的使用时程序设计中需要考虑的重要因素之一&…

java转换为c#_C#vs Java哪一个更快? 将25k C#转换为Java(2)

java转换为c#在上一篇文章中&#xff0c;我描述了如何将25k行C&#xff03;转换为Java以及从该练习中学到的教训。 我收到以下问题&#xff1a; 顺便说一句很棒的文章。 移植代码后&#xff0c;性能与C&#xff03;版本相比如何&#xff1f; 改写系统的动机之一是使系统运行更…

基于人工神经网络的识别C语言,实验一基于人工神经网络的数码识别.doc

实验一基于人工神经网络的数码识别《人工智能导论》课程基于人工神经网络的数码识别班级&#xff1a;计1103学号&#xff1a;201107010330姓名&#xff1a;贾梦洁成绩评定&#xff1a;评阅老师&#xff1a;日 期&#xff1a;实验报告正文一、实验目的?????基于神经网络的数…

博科光纤交换机java_带有光纤的可扩展,健壮和标准的Java Web服务

博科光纤交换机java这篇博客文章讨论了负载下的基准Web服务性能。 要了解有关Web服务性能理论的更多信息&#xff0c;请阅读利特尔定律&#xff0c;可伸缩性和容错 。 使用阻塞和异步IO对Web服务进行基准测试 Web应用程序&#xff08;或Web服务&#xff09;如何在负载下&#…

很棒的C语言入门笔记,推荐收藏!

点击蓝字关注我们c语言入门C语言一经出现就以其功能丰富、表达能力强、灵活方便、应用面广等特点迅速在全世界普及和推广。C语言不但执行效率高而且可移植性好&#xff0c;可以用来开发应用软件、驱动、操作系统等。C语言也是其它众多高级语言的鼻祖语言&#xff0c;所以说学习…

自定义日历控android,Android自定义日历Calender代码实现

产品要做签到功能&#xff0c;签到功能要基于一个日历来进行&#xff0c;所以就根据 要求自定义了一个日历自定义控件相信做android都知道&#xff1a;(1)首先创建一个类&#xff0c;继承一个容器类或者是一个控件(2)然后就是你需要设置的属性等的&#xff0c;在attrs文件夹中(…

java jsf_将Java 8日期时间API与JSF和Java EE 7结合使用

java jsf如果您将Java 8与Java EE 7一起使用&#xff0c;则在尝试利用某些Java 8新功能时可能会遇到一些怪癖。 一个这样的怪癖是&#xff0c;默认情况下&#xff0c;新的Date-Time API不适用于许多Java EE 7 API&#xff0c;因为它们是为与java.util.Date和/或更旧的Date API一…

C语言的注释要注意几点

点击蓝字关注我们如果领导给你一个项目的源码让你阅读&#xff0c;并理解重构代码&#xff0c;但里面一句注释都没有&#xff0c;我想这肯定是之前同事“删库跑路”了。看一份源码什么很重要&#xff1f;除了各种代码规范之外&#xff0c;还有一个比较重要的就是注释。注释虽然…