如果你在工作中经常使用lambda,那么你一定遇到过对已在使用lambda中处理异常的头疼问题,那么这篇文章就可以帮你优雅的处理lambda中遇到的异常处理问题。如果你还没有开始使用java8的lambda,作者劝你尽快加入,会发现函数式编程的很多乐趣,会让你的代码非常优雅,更加惊艳哦!

    public static void main(String[] args) {findClass(Collections.singletonList("hello"));}public static List<Class> findClass(List<String> classNameList) {return classNameList.stream().map(className -> {try {return Class.forName(className);} catch (ClassNotFoundException e) {e.printStackTrace();return null;}}).collect(Collectors.toList());}

在上面这段程序中,你会发现由于lambda表达式的机制,你无法将这个uncheck exception去抛给调用方必须自己处理这个异常,并且会让代码现在很臃肿,没有函数式编程的优雅。
这个问题在 stackoverflow上面也是有人很早就提出过——>stackoverflow链接

里面比较好的解答就是巧妙的解决的了这个问题

public final class LambdaExceptionUtil {@FunctionalInterfacepublic interface ConsumerWithExceptions<T, E extends Exception> {void accept(T t) throws E;}@FunctionalInterfacepublic interface BiConsumerWithExceptions<T, U, E extends Exception> {void accept(T t, U u) throws E;}@FunctionalInterfacepublic interface FunctionWithExceptions<T, R, E extends Exception> {R apply(T t) throws E;}@FunctionalInterfacepublic interface SupplierWithExceptions<T, E extends Exception> {T get() throws E;}@FunctionalInterfacepublic interface RunnableWithExceptions<E extends Exception> {void run() throws E;}/*** .forEach(rethrowConsumer(name -> System.out.println(Class.forName(name)))); or .forEach(rethrowConsumer(ClassNameUtil::println));*/public static <T, E extends Exception> Consumer<T> rethrowConsumer(ConsumerWithExceptions<T, E> consumer) throws E {return t -> {try {consumer.accept(t);} catch (Exception exception) {throwAsUnchecked(exception);}};}public static <T, U, E extends Exception> BiConsumer<T, U> rethrowBiConsumer(BiConsumerWithExceptions<T, U, E> biConsumer) throws E {return (t, u) -> {try {biConsumer.accept(t, u);} catch (Exception exception) {throwAsUnchecked(exception);}};}/*** .map(rethrowFunction(name -> Class.forName(name))) or .map(rethrowFunction(Class::forName))*/public static <T, R, E extends Exception> Function<T, R> rethrowFunction(FunctionWithExceptions<T, R, E> function) throws E {return t -> {try {return function.apply(t);} catch (Exception exception) {throwAsUnchecked(exception);return null;}};}/*** rethrowSupplier(() -> new StringJoiner(new String(new byte[]{77, 97, 114, 107}, "UTF-8"))),*/public static <T, E extends Exception> Supplier<T> rethrowSupplier(SupplierWithExceptions<T, E> function) throws E {return () -> {try {return function.get();} catch (Exception exception) {throwAsUnchecked(exception);return null;}};}/*** uncheck(() -> Class.forName("xxx"));*/public static void uncheck(RunnableWithExceptions t) {try {t.run();} catch (Exception exception) {throwAsUnchecked(exception);}}/*** uncheck(() -> Class.forName("xxx"));*/public static <R, E extends Exception> R uncheck(SupplierWithExceptions<R, E> supplier) {try {return supplier.get();} catch (Exception exception) {throwAsUnchecked(exception);return null;}}/*** uncheck(Class::forName, "xxx");*/public static <T, R, E extends Exception> R uncheck(FunctionWithExceptions<T, R, E> function, T t) {try {return function.apply(t);} catch (Exception exception) {throwAsUnchecked(exception);return null;}}@SuppressWarnings("unchecked")private static <E extends Throwable> void throwAsUnchecked(Exception exception) throws E {throw (E) exception;}}

那么我用LambdaExceptionUtil处理之前的程序


我们发现他将这个异常可以抛出给调用方使用了,这样就完美的解决了上面的问题,也让我们的代码很优雅了。

当java 8 lambda遇上uncheck exception相关推荐

  1. Java游戏守卫者_我的世界:当java版玩家遇上基岩版玩家,原来MC中也存在语言不通...

    原标题:我的世界:当java版玩家遇上基岩版玩家,原来MC中也存在语言不通 事情起因:有小伙伴投稿,说自己被同学拉入了一个<我的世界>群聊,自己原准备大侃特侃,但发现他们聊的东西跟自己玩的 ...

  2. 当Java代码遇上抽象、重载加重写,一切都不美好了

    当Java代码遇上抽象.重载加重写.一切都不美好了 前几天调程序遇上个奇怪的bug.一直没找到问题,今天最终发现问题所在了,不说了先上代码(下面代码是演示样例代码,经測试,Java不存在这问题,安卓存 ...

  3. @Transactional(rollbackFor=Exception.class) 遇上try catch

    当@Transactional遇上try catch @Transactional(rollbackfor=Exception.class)--抛出Exception,执行回滚 但是如果被catch捕 ...

  4. Java可以hook微信吗,【第一篇】【安卓微信】HOOK微信发消息,当HOOK遇上HOOK。

    前人栽树,后人吃桃. 准备入坑 安卓 xposed hook 微信(及时通信),好吧,第一步当然是论坛里面搜索啦,像掷骰子.计步器什么的都是小孩子过家家入门级别的,当然是要搞就搞(及时通信).微信 a ...

  5. java lambda使用_在Java 8 Lambda上使用Apache Commons Functor功能接口

    java lambda使用 Apache Commons Functor (以下称为[functor])是一个Apache Commons组件,它提供功能性的编程API和已实现的几种模式(访问者,生成 ...

  6. 在Java 8 Lambda上使用Apache Commons Functor功能接口

    Apache Commons Functor (以下称为[functor])是一个Apache Commons组件,它提供功能性的编程API和已实现的几种模式(访问者,生成器,聚合器等). Java ...

  7. java赋值兼容原则,多态问题抛出(赋值兼容性原则遇上父类与子类同名函数的时候)...

    首先通过一个段代码来分析 #include class Parent//定义父类 { public: Parent(int a = 0) { this->a = a; } void print( ...

  8. VS Code 遇上 Java丨第三章:项目创建与管理

    读不在三更五鼓,功只怕一曝十寒. 创建项目 使用快捷键 Ctrl+Shift+E 进入资源管理器面板,选择 Java Projects 分类,点击分类工具栏中的「Create Java Project ...

  9. java 双路cpu_当猫头鹰遇上supermicro, 双路E5折腾记

    本帖最后由 findlcy 于 2019-2-19 10:09 编辑 此贴目的原为记录 家里闲置机箱fractal design define c 的装机过程.结果机缘巧合(没做好功课)之下,两个小时 ...

  10. 深入理解Java 8 Lambda(语言篇——lambda,方法引用,目标类型和默认方法)

    作者:Lucida 微博:@peng_gong 豆瓣:@figure9 原文链接:http://zh.lucida.me/blog/java-8-lambdas-insideout-language- ...

最新文章

  1. 010_Spring Data JPA一对多关系
  2. 物理光学8 多波束干涉
  3. 10.线程池与连接池
  4. golang中go mod使用第三方包
  5. Longest Palindromic Substring
  6. 计算机网络 | 网络层 :IP协议详解
  7. 明天要中秋节了,先来到简单“类”的题目
  8. 补充一点地理知识(以洲来划分各个国家(240个))
  9. VUE: 当前页面 引用自定义公用样式 (:style=“样式名“)
  10. POJ 1028 浏览器前进后退(双栈)
  11. jquery each函数 break和continue功能
  12. [Unity] ACT 战斗系统学习 5:使用 ScriptableObject 制作角色属性 1
  13. Core Animation 文档翻译 (第六篇)—高级动画技巧
  14. Flink流处理练习
  15. 二层、三层、四层交换的比较
  16. 转载--数据库sql取整操作
  17. tomcat源码阅读
  18. 最大功率点跟踪测试软件,最大功率点跟踪(MPPT)
  19. 三星on 7刷android7,三星On7(G6100)安卓8.0版官方固件rom刷机包
  20. (8个方法)解决windows11/10/8/7卡在准备就绪一直转圈

热门文章

  1. 形容计算机技术发展的词,形容技术发展的成语是什么_四字词语 - 成梦词典
  2. 思科1242 AP无法连接到无线控制器
  3. python使用list方法,将迭代器转换为列表后,再次循环打印迭代器输出为空
  4. C语言求若干个数的均值和方差
  5. Aborting commit due to empty commit message.
  6. win7显示u盘efi分区_Win7下查看U盘中的EFI盘方法
  7. [ACCESS]档案数字化加工录入系统使用说明(干部职工退休档案)
  8. 回波损耗和电压驻波比
  9. 不要问我1是不是质数
  10. 《梦幻西游手游》分析报告