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

news/2024/7/19 13:20:30 标签: java, python, js, lambda, php
<a class=lambda表达式" width="403px" height="256px" style="outline: none;" />

lambda表达式

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

该方法背后的想法是,以允许用户在不同的实施方式中通过InputStream的方法,以便writeToFile可以被称为例如用GZIPOuputStream , SnappyOuputStream(快速压缩)或简单的FileInputStream

java">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);
    }
}

这是一个整洁的函数,可以这样调用:

java">public static void main(String[] args) {
    try {
        //Write with compression
        //DOES NOT COMPILE!!
        writeToFile(new File("test"), "Hello World", GZIPOutputStream::new);
        //Just use the FileOutputStream
        writeToFile(new File("test"), "Hello World", i->i);
    }catch(IOException e){
        //deal with exception as you choose
    }
}

不幸的是,正如评论中指出的那样,它无法编译! 它之所以无法编译,是因为GZIPOutputStream在其构造函数中引发了IOException 。 如果将IOException从lambda中抛出,然后可以在try catch块中进行处理,那将是很好的选择–但这不是lambda的工作方式:-(

实际上,这是您必须处理异常以使代码得以编译的方式:

java">public static void main(String[] args) {
    try {
        //Write with compression
        //COMPILES BUT SO UGLY
        writeToFile(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 FileOutputStream
        writeToFile(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现在以它们使我们的代码更漂亮和更易于理解的方式使用。

请参阅下面的完整代码清单:

java">package util;
 
import java.io.*;
import java.util.zip.GZIPOutputStream;
 
public class LambdaExceptions {
    public static void main(String[] args) {
        try {
            //Write with compression
            writeToFile(new File("test"), "Hello World", GZIPOutputStream::new);
            //Just use the FileOutputStream
            writeToFile(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);
        } 
    }
 
    @FunctionalInterface
    public 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.niftyadmin.cn/n/1707768.html

相关文章

页面跳转_跳转到企业缓存之前要考虑的事情

页面跳转介绍 关系数据库事务是ACID &#xff0c;强大的一致性模型简化了应用程序开发。 由于启用Hibernate缓存是一项配置&#xff0c;因此&#xff0c;只要数据访问层开始出现性能问题&#xff0c;就转向缓存非常吸引人。 添加缓存层确实可以提高应用程序性能&#xff0c;但是…

dojo目录树_我的Dojo中有一个Mojo(如何编写Maven插件)

dojo目录树我一直忙于在工作中使用Maven的腋窝。 对于很多开发人员&#xff0c;我会听到&#xff1a;“那又怎样。” 所不同的是&#xff0c;我通常在无法直接访问Internet的环境中工作。 因此&#xff0c;当我说我经常使用Maven时&#xff0c;这意味着某些事情。 依赖地狱 公平…

java安装_每个Java开发人员都必须避免的9个安全错误

java安装Checkmarx CxSAST是功能强大的源代码分析(SCA)解决方案&#xff0c;旨在从根本上识别&#xff0c;跟踪和修复技术和逻辑安全漏洞&#xff1a;源代码。 在这里查看&#xff01; 自从1995年中期引入Java以来​​&#xff0c;它已经走了很长一段路。 它的跨平台特性使其成…

异常--org.jdom.JDOMException: java.lang.NoSuchMethodError: org.jaxen.BaseXPath.init

异常截图 解决方案 创建类XPath对象失败,没有找到org.jaxen.BaseXPath这个类经过排查发现dom4j的jar包和jdom的jar包同时包含org.jaxen.BaseXPath; 查询资料发现类加载是—谁在前面就先加载谁&#xff0c;不会覆盖修改pom文件中jar包位置,恢复正常

阿里java面试题

1、线程怎么保持同步 使用synchronized关键字同步方法或代码 2、spring中bean的周期是怎样的 1&#xff1a;两个类如何产生关系 2&#xff1a;java把一个文件的内容复制到另外一个文件上 3、给了一个场景&#xff0c;在一个数组中怎么找出两个相加是是10的数&#xff08;这题不…

你知道什么叫场景报表吗?

在当前这个大数据时代中&#xff0c;数据可视化已成为了一个不可缺少的应用形式&#xff0c;除此之外还诞生一种叫做场景报表的应用形式。场景报表顾名思义就是用于显示特定场景的信息和操作&#xff0c;就拿百数的场景报表来说&#xff0c;其主要是支持两种功能——地图定位报…

数据库系统原理

数据库系统原理数据库系统基本概念1.1数据管理技术的发展数据库设计和ER模型关系模式设计理论关系运算SQL语言数据库管理SQL Server 2000简介及应用数据库技术的发展数据库系统基本概念 1.1数据管理技术的发展 信息— 是客观事物属性的反映.它反映了客观事物的某一属性或某一时…

码出高效

码出高效一.计算机基础1.1 0和1的世界原码,反码,补码为什么出现反码,补码位运算1.2 浮点数1.3 字符集与乱码1.4 CPU与内存1.5 TCP/IP1.6 信息安全二.面向对象2.1 OOP理念2.2 初识Java2.3 类2.4 方法三.代码风格3.1 命名规约3.1.1 常量3.1.2 变量3.2 代码展示风格3.2.1 缩进,空格…