传统的多分支方式(圈复杂度为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> map = new HashMap<>();

public String order2(String type){

init();

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

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的三种用法================

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

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

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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

java8 function 固定0_Java8特性使用Function代替分支语句相关推荐

  1. java8新特性之Function.identity()

    Function.identity()是什么? // 将Stream转换成容器或Map Stream<String> stream = Stream.of("I", & ...

  2. Java基础笔记-Java8及其他新特性

    第十六章 Java8及其他新特性 16.1 Java8新特性简介 16.2 lambda表达式和函数式接口 16.3 方法引用与构造器引用 16.4 StreamAPI的使用 16.5 Optiona ...

  3. Java8的一些新特性

    Java8的一些新特性 文章目录 Java8的一些新特性 1.函数式接口 2.Lambda表达式 2.1.介绍 2.2.案例 2.3.案例讲解 3.方法引用 3.1.介绍 3.2.案例 4.Strea ...

  4. Java基础学习总结(33)——Java8 十大新特性详解

    Java8 十大新特性详解 本教程将Java8的新特新逐一列出,并将使用简单的代码示例来指导你如何使用默认接口方法,lambda表达式,方法引用以及多重Annotation,之后你将会学到最新的API ...

  5. JAVA8 十大新特性详解

    JAVA8 十大新特性详解 http://www.jb51.net/article/48304.htm java7和java6比较有什么不同 转载于:https://www.cnblogs.com/y ...

  6. 【element 】使用xlsx、FileSaver实现导出,CDN引入,FileSaver.saveAs is not a function.saveAs is not a function

    系统前端采用element ui,现在需要实现一个导出的功能,各种搜索找到XLsx.FileSaver. CDN方式引入:(网上基本很少CDN引入) <script src="//cd ...

  7. 深入学习Java8 Lambda (default method, lambda, function reference, java.util.function 包)

    Java 8 Lambda .MethodReference.function包 多年前,学校讲述C#时,就已经知道有Lambda,也惊喜于它的方便,将函数式编程方式和面向对象式编程基于一身.此外在使 ...

  8. java8 group by_java8新特性Java 8 – Stream Collectors groupingBy 示例 - Java教程

    在这篇教程中,将向你展示如何使用Java 8 Stream的Collectors,来对一个List进行分组,计算个数,求和以及排序. 1. Group By, Count and Sort 1.1 对 ...

  9. JAVA8 十大新特性

    一.接口的默认方法 Java 8允许我们给接口添加一个非抽象的方法实现,只需要使用 default关键字即可,这个特征又叫做扩展方法,示例如下: 复制代码代码如下: interface Formula ...

最新文章

  1. Android控件点击圆形阴影反馈解决方案
  2. C语言字母和数字数量,请问这个用c怎么做:输入一串字符,分别统计其中数字和字母的个数...
  3. 如何检查对象的类型[iOS/Android/Windows Phone]
  4. 之江杯2020零样本目标分割题参赛总结
  5. VBS脚本恶作剧:关机+重启后自动关机
  6. 一文读懂层次聚类(Python代码)
  7. nagios监控之(监控配置)
  8. 如何使用MySQL和JPA使用Spring Boot构建Rest API
  9. Nginx主配置文件nginx.conf中文详解
  10. 各层作用_OSI模型中各层在通信中的作用
  11. vim编辑器操作汇总
  12. 卫星影像的AI分类与识别 线上Top1
  13. 拉扎维对于简单CMOS电路的增益计算方法
  14. web前端制作网页步骤以及制作网页学习教程
  15. Django restframework中Serializer序列化器-用法详解
  16. c语言中if函数作用,c语言函数if的用法怎么用
  17. TPM设备管理学习心得
  18. 电器元件——LM7805
  19. overleaf怎么输入中文_【LATEX】在线latex排版工具Overleaf-制作中文简历-详细教程...
  20. antd 表格分页功能

热门文章

  1. Android WebView重定向问题,Android Webview重定向问题解决方法
  2. word更新域后图片错误_你还不知道Word中F1~F12键作用?
  3. python自动化测试-简单实现接口自动化测试(基于python)
  4. python简单代码-手把手教你用Python创建简单的神经网络(附代码)
  5. python 入门基础-Python 如何入门?
  6. python是什么专业学的-python编程学习需要哪些基础和准备工作?
  7. 自学python需要安装什么-终于明白python需要学什么
  8. python练手经典100例-20个Python练手经典案例,能全做对的人确实很少!
  9. python电脑配置-Python--获取电脑配置信息--设计代码
  10. 本地离线语音识别芯片哪家强