Java8特性使用Function代替分支语句
传统的多分支方式(圈复杂度为6):
publicStringorder(Stringtype){ if("1".equals(type)){ return"1"; }elseif("2".equals(type)){ return"2"; }elseif("3".equals(type)){ return"3"; }elseif("4".equals(type)){ return"4"; }elseif("5".equals(type)){ return"5"; }else{ return"none"; } }
使用Function函数式编程的新方式:
privateMap>map=newHashMap<>(); publicStringorder2(Stringtype){ init(); Function fun=map.get(type); Stringresult=fun.apply(type); returnresult; } publicvoidinit(){ map.put("1",a->{ System.out.println("执行1分支"); returna+"1"; }); map.put("2",a->{ System.out.println("执行2分支"); returna+"22"; }); map.put("3",a->{ System.out.println("执行3分支"); returna+"333"; }); map.put("4",a->{ System.out.println("执行4分支"); returna+"4444"; }); map.put("5",a->{ System.out.println("执行5分支"); returna+"55555"; }); }
圈复杂度为0;
总结:
1.Function是一个接口,它完整的样子是这样:Function
2.apply方法是function函数的统一执行标志性方法,它接受第一条提到的Tt,返回第一条提到的Rr,不管function函数体有多复杂,统统按apply执行,就像所有的线程统统用start开始执行.
3.以前在有很多if-else的场合时,也想过把决定分支的入参(用type表示)和所执行的代码建立映射关系,但那时候因为不懂Function,心里想Map里面只能装数据类型,像分支逻辑这种不是数据类型,没法装.如今学习了Function,发现它把代码逻辑也封装得了,正好满足了我的设想.真的太好用了.
4.以前用if-else执行多分支时,走入不同分支还需要一个个对照,现在用了函数式编程,直接根据map查映射关系就找到了,很是方便.
最后总结:
以后遇到if-else较多的场合,可以考虑使用Function函数代替
普通的方法是将一种数据类型作为参数,而Function方法是将一种方法或表达式作为参数.
=======================补充:与策略模式的对比=======================
策略模式也是为了解决分支过多问题,此外它还解决另一个大问题:避免代码侵入,新增策略不需要修改原有策略代码.此处主要对比第一点:解决分支过多
策略模式通过两层结构,完美实现了传入不同的策略,执行不同的方案,这与if-else的目标是一致的,当然与Function的目标也是一致的.
传入1,选择策略1,执行策略1
传入2,选择策略2,执行策略2
如何实现传入N,就能选择策略N呢?使用映射表Map
从广义上说,if-else,Function,策略模式,它们三者都是策略,解决的都是分支问题,只不过粒度由小到大,重量级不同而已.
如何选择呢?
能用if-else就不用Function,能用Function就不用策略模式
简单的,就用轻量级的
复杂的,就用重量级的.
===============题外思考:Map的三种用法================
- 初级:Map
======>通过一个数据可以获取另一个数据 - 中级:Map
=======>通过一个数据可以获取一个方法 - 高级:Map
=============>通过一个数据可以获取一个设计
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。