时间:2021-05-19
传统的多分支方式(圈复杂度为6):
public String order(String type) { if ("1".equals(type)) { return "1"; } else if ("2".equals(type)) { return "2"; } else if ("3".equals(type)) { return "3"; } else if ("4".equals(type)) { return "4"; } else if ("5".equals(type)) { return "5"; } else { return "none"; }}使用Function函数式编程的新方式:
private Map<String, Function<String, String>> map = new HashMap<>();public String order2(String type){ init(); Function<String, String> fun = map.get(type); String result = fun.apply(type); return result;}public void init() { map.put("1", a -> { System.out.println("执行1分支"); return a + "1"; }); map.put("2", a -> { System.out.println("执行2分支"); return a + "22"; }); map.put("3", a -> { System.out.println("执行3分支"); return a + "333"; }); map.put("4", a -> { System.out.println("执行4分支"); return a + "4444"; }); map.put("5", a -> { System.out.println("执行5分支"); return a + "55555"; });}圈复杂度为0;
总结:
1.Function是一个接口,它完整的样子是这样: Function<T,R>,其中T表示接受一个T类型的入参,R表示返回一个R类型的出参,注意: 既然入参和出参都是一个泛型,那就说明可以适用于任何种类的方法,如果方法需要多个入参,可以把它们封装成T类型的入参VO, 如果出参也需要有多个参数,也可以把它们封装为一个R类型的出参VO.
2. apply方法是function函数的统一执行标志性方法,它接受第一条提到的T t,返回第一条提到的R r,不管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<String, Strategy>, 这点和Function的思想是一样,只不过策略模式通过类型获取封装好的策略实例,而Function通过类型获取封装好的策略方法.
从广义上说, if-else, Function, 策略模式,它们三者都是策略,解决的都是分支问题,只不过粒度由小到大,重量级不同而已.
如何选择呢?
能用if-else就不用Function,能用Function就不用策略模式
简单的,就用轻量级的
复杂的,就用重量级的.
===============题外思考: Map的三种用法================
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
java8引入了lambda表达式,lambda表达式实际上表示的就是一个匿名的function。在java8之前,如果需要使用到匿名function需要new
一、Lambda表达式简介Lambda表达式,是Java8的一个新特性,也是Java8中最值得学习的新特性之一。(另一个新特性是流式编程。)Lambda表达式,
前言Java8新特性java.time.*包学习。自从java发布模式变更就发现自己有些跟不上他们的速度,java8还有不少没有用透而9、10、11相继出来,长
摘要:本文介绍了Java8中流的几个特性,以告诫开发者流并不是高性能的代名词,需谨慎使用流。以下是译文。流(Stream)是Java8为了实现最佳性能而引入的一
为什么要单独写个Java8新特性,一个原因是我目前所在的公司用的是jdk8,并且框架中用了大量的Java8的新特性,如上篇文章写到的stream方法进行过滤ma