DebugEN
科技森
专注于Java开发~每天都会更新文章~
  1. 首页
  2. Java
  3. 正文

[原创]javaslang(vavr.io)中Try的使用

2021年02月27日 1602点热度 0人点赞 0条评论 作者: kejisen

前言

我们在实际的开发中,经常会遇到一些受检异常,我们会使用一个try-catch将其包裹在其中,如下面所示


try {
    InputStream is = new FileInputStream(new File(...));
} catch(IOException e) {
    // TODO 
}

这样可能看不出来问题,假如我现在有多个文件需要处理,多个文件名存储在一个List中:

List<File> files = List.of(
                new File("/tmp/01.txt"),
                new File("/tmp/02.txt")
        );
files.forEach(f -> {
   try {
       List<String> strings = FileUtils.readLines(f, Charset.forName("UTF-8"));
                strings.forEach(System.out::println);
   } catch (IOException e) {
       System.out.println("抛异常了");
   }
});

这样很明显了,我使用java8的forEach来迭代这个list,但是因为文件的读取会抛出一个IOException,所以我必须在forEach内部加try-catch代码块,有代码洁癖的同事看到这里会非常难受,明明我已经使用了forEach来替代丑陋的for循环了,为什么会这样呢?

解决方案

方案一——把抛异常的代码单独封装成一个方法

private static void accept(File f) {
    try {
        List<String> strings = FileUtils.readLines(f, Charset.forName("UTF-8"));
        strings.forEach(System.out::println);
    } catch (IOException e) {
        System.out.println("抛异常了");
    }
}
...
files.forEach(Demo02::accept);

javaslang的Try

我们可以想一下,在这个场景中,我们是否真的有必要处理IOException,文件不存在,输入输出流异常?在实际的项目中,我们可能根本不需要关注这个异常,因为发生异常的时候,肯定是数据错误或者系统错误,我们不需要关注,那这个try-catch到底是为了什么?在我看来,这就是垃圾代码,需要优化。
幸运的是,我们有了一个可以处理异常的库——javaslang(Try只是它其中一个功能),上面的diamante就可以简化成:

files.stream().map(f -> Try.of(() ->      FileUtils.readLines(f, Charset.forName("UTF-8")))
                .onFailure(Throwable::printStackTrace))
                .filter(Try::isSuccess)
                .map(Try::get)
                .forEach(System.out::println);

是不是十分方便?Try有多个方法,比如onFailure可以让你在异常时执行一段代码,它还有类似Java8的流式处理的功能,非常方便。

有关javaslang的更多内容可以查看javaslang

标签: exception java javaslang try
最后更新:2021年03月03日

kejisen

保持饥渴的专注,追求最佳的品质

点赞
< 上一篇
下一篇 >

文章评论

取消回复
最新 热点 随机
最新 热点 随机
【原创】记录一次失败的折腾——使用jkeymaster实现的按键监听 【原创】这些年我用过的IDEA插件 【原创】在windows上使用VNC远程连接linux桌面 我在RxJava使用线程池时遇到的问题 [原创文章] Swagger生成pdf格式的接口文档 [个人翻译]Java HTTP工具类的客户端证书认证 [原创] 如何从 Git 的提交历史记录中删除大文件 [翻译] 创建一个只读的Repository接口(Spring Data) [翻译] 反射的用法——用Java调用私有方法 Java 虚拟机最多可以支持多少个线程? 排查Hibernate的慢查询日志–这是查找慢查询的最简单方法 [翻译] 使用apache poi在excel文件中插入一行数据 [翻译] 在Spring 中@EntityScan与@ComponentScan注解有什么区别 [原创] 从QQ音乐网页版扒歌词的补充说明 [原创] 介绍java maven项目的多种打包方式 原创——在Java中生成随机数 将G1垃圾回收的内存使用量减少20%(翻译) [原创] java8 lambda表达式的toMap造成的空指针异常 [原创] 在Spring Boot中使用CommandLineRunner来在启动时执行代码 [转载] Kafka 节点重启失败导致数据丢失的分析排查与解决之道
如何设置Servlet的session超时时间 排查Hibernate的慢查询日志–这是查找慢查询的最简单方法 在Java中生成随机的日期 将G1垃圾回收的内存使用量减少20%(翻译) 我在RxJava使用线程池时遇到的问题 [原创] java8 lambda表达式的toMap造成的空指针异常 【原创】记录一次失败的折腾——使用jkeymaster实现的按键监听 [原创]javaslang(vavr.io)中Try的使用 原创——在Java中生成随机数 Linux截图软件推荐-flameshot [个人翻译]Java HTTP工具类的客户端证书认证 Spring Boot的@RequestMapping注解中加斜杠与不加斜杠的区别 从QQ音乐获取并解析音乐的歌词 使用Spring RestTemplate压缩请求 [转载] Kafka 节点重启失败导致数据丢失的分析排查与解决之道 [原创文章] Swagger生成pdf格式的接口文档 【原创】这些年我用过的IDEA插件 [翻译] 反射的用法——用Java调用私有方法 中通Elasticsearch集群运维实践 中通Elasticsearch集群运维实践(二)--监控告警
标签聚合
maven 歌词 base64 json spring springboot qq音乐 java linux elasticsearch

COPYRIGHT © 2020 Kejisen. ALL RIGHTS RESERVED.

THEME KRATOS MADE BY VTROIS