Java8特性使用Function代替分支语句

网友投稿 291 2022-11-23


Java8特性使用Function代替分支语句

传统的多分支方式(圈复杂度为6):

public String order(String type) {

if ("1".equals(type)) {

return "1";

} else if ("2".equals(thttp://ype)) {

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> map = new HashMap<>();

public String order2(String type){

init();

PMktTUx Function 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("执行PMktTUx5分支");

return a + "55555";

});

}

圈复杂度为0;

总结:

1.Function是一个接口,它完整的样子是这样: Function,其中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, 这点和Function的思想是一样,只不过策略模式通过类型获取封装好的策略实例,而Function通过类型获取封装好的策略方法.

从广义上说, if-else, Function, 策略模式,它们三者都是策略,解决的都是分支问题,只不过粒度由小到大,重量级不同而已.

如何选择呢?

能用if-else就不用Function,能用Function就不用策略模式

简单的,就用轻量级的

复杂的,就用重量级的.

===============题外思考: Map的三种用法================

初PMktTUx级: Map======>通过一个数据可以获取另一个数据

中级: Map=======> 通过一个数据可以获取一个方法

高级: Map=============> 通过一个数据可以获取一个设计


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Idea中使用Git的流程
下一篇:Java BIO,NIO,AIO总结
相关文章

 发表评论

暂时没有评论,来抢沙发吧~