别人说烂了的stream api不就不想赘述了,我想和大家分享一下,如何用函数式编程来简化我们的开发,想说点不一样的东西
简化事务
对于事务而言,应该粒度越小越好,并且读写逻辑应该分开,只在写的逻辑上执行事务,可以用函数式编程来简化抽去写逻辑这一步
1 | java复制代码@Service |
赋予方法重试能力
1 | java复制代码 public static void retryFunction(ThrowExceptionRunnable runnable, int time) { |
赋予函数缓存能力
1 | java复制代码public static <T, R> R cacheFunction(Function<T, R> function, T t, Map<T, R> cache) { |
赋予函数报错返回默认值能力
1 | java复制代码 public static <T, R> R computeOrGetDefault(ThrowExceptionFunction<T, R> function, T t, R r) { |
赋予函数处理异常的能力
1 | java复制代码 public static <T, R> R computeAndDealException(ThrowExceptionFunction<T, R> function, T t, Function<Exception, R> dealFunc) { |
赋予函数记录日志能力
1 | java复制代码public static <T, R> R logFunction(Function<T, R> function, T t, String logTitle) { |
自定义函数接口
1 | java复制代码 @FunctionalInterface |
Q:为什么要自定义函数接口
A:自带的函数接口无法处理检查异常,遇见带检查异常的方法会报错
我哪些场景用到了?
链式取数
在翻译php代码的时候我们常常遇到如下情况
1 | php复制代码$s = a.b.c.d.e.f.g |
然后翻译成java代码的时候是这样的
1 | java复制代码String s = a.getB().getC().getD().getE().getF().getG(); |
有啥问题?没有没有判空,只要中间有一层为空,那么就是NPE,要是去写判空逻辑的话,真是要了命了
这时我们就可以用上上面提到的骚操作了
代码改写
1 | java复制代码String s = computeOrGetDefault(()->a.getB().getC().getD().getE().getF().getG(),""); |
事务
简单的降级操作(computeAndDealException)
接口重试
接口缓存
记录日志
本文转载自: 掘金