当java 8 lambda遇上uncheck exception
如果你在工作中经常使用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相关推荐
- Java游戏守卫者_我的世界:当java版玩家遇上基岩版玩家,原来MC中也存在语言不通...
原标题:我的世界:当java版玩家遇上基岩版玩家,原来MC中也存在语言不通 事情起因:有小伙伴投稿,说自己被同学拉入了一个<我的世界>群聊,自己原准备大侃特侃,但发现他们聊的东西跟自己玩的 ...
- 当Java代码遇上抽象、重载加重写,一切都不美好了
当Java代码遇上抽象.重载加重写.一切都不美好了 前几天调程序遇上个奇怪的bug.一直没找到问题,今天最终发现问题所在了,不说了先上代码(下面代码是演示样例代码,经測试,Java不存在这问题,安卓存 ...
- @Transactional(rollbackFor=Exception.class) 遇上try catch
当@Transactional遇上try catch @Transactional(rollbackfor=Exception.class)--抛出Exception,执行回滚 但是如果被catch捕 ...
- Java可以hook微信吗,【第一篇】【安卓微信】HOOK微信发消息,当HOOK遇上HOOK。
前人栽树,后人吃桃. 准备入坑 安卓 xposed hook 微信(及时通信),好吧,第一步当然是论坛里面搜索啦,像掷骰子.计步器什么的都是小孩子过家家入门级别的,当然是要搞就搞(及时通信).微信 a ...
- java lambda使用_在Java 8 Lambda上使用Apache Commons Functor功能接口
java lambda使用 Apache Commons Functor (以下称为[functor])是一个Apache Commons组件,它提供功能性的编程API和已实现的几种模式(访问者,生成 ...
- 在Java 8 Lambda上使用Apache Commons Functor功能接口
Apache Commons Functor (以下称为[functor])是一个Apache Commons组件,它提供功能性的编程API和已实现的几种模式(访问者,生成器,聚合器等). Java ...
- java赋值兼容原则,多态问题抛出(赋值兼容性原则遇上父类与子类同名函数的时候)...
首先通过一个段代码来分析 #include class Parent//定义父类 { public: Parent(int a = 0) { this->a = a; } void print( ...
- VS Code 遇上 Java丨第三章:项目创建与管理
读不在三更五鼓,功只怕一曝十寒. 创建项目 使用快捷键 Ctrl+Shift+E 进入资源管理器面板,选择 Java Projects 分类,点击分类工具栏中的「Create Java Project ...
- java 双路cpu_当猫头鹰遇上supermicro, 双路E5折腾记
本帖最后由 findlcy 于 2019-2-19 10:09 编辑 此贴目的原为记录 家里闲置机箱fractal design define c 的装机过程.结果机缘巧合(没做好功课)之下,两个小时 ...
- 深入理解Java 8 Lambda(语言篇——lambda,方法引用,目标类型和默认方法)
作者:Lucida 微博:@peng_gong 豆瓣:@figure9 原文链接:http://zh.lucida.me/blog/java-8-lambdas-insideout-language- ...
最新文章
- 010_Spring Data JPA一对多关系
- 物理光学8 多波束干涉
- 10.线程池与连接池
- golang中go mod使用第三方包
- Longest Palindromic Substring
- 计算机网络 | 网络层 :IP协议详解
- 明天要中秋节了,先来到简单“类”的题目
- 补充一点地理知识(以洲来划分各个国家(240个))
- VUE: 当前页面 引用自定义公用样式 (:style=“样式名“)
- POJ 1028 浏览器前进后退(双栈)
- jquery each函数 break和continue功能
- [Unity] ACT 战斗系统学习 5:使用 ScriptableObject 制作角色属性 1
- Core Animation 文档翻译 (第六篇)—高级动画技巧
- Flink流处理练习
- 二层、三层、四层交换的比较
- 转载--数据库sql取整操作
- tomcat源码阅读
- 最大功率点跟踪测试软件,最大功率点跟踪(MPPT)
- 三星on 7刷android7,三星On7(G6100)安卓8.0版官方固件rom刷机包
- (8个方法)解决windows11/10/8/7卡在准备就绪一直转圈