java8 function 固定0_Java8特性使用Function代替分支语句
传统的多分支方式(圈复杂度为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代替分支语句相关推荐
- java8新特性之Function.identity()
Function.identity()是什么? // 将Stream转换成容器或Map Stream<String> stream = Stream.of("I", & ...
- Java基础笔记-Java8及其他新特性
第十六章 Java8及其他新特性 16.1 Java8新特性简介 16.2 lambda表达式和函数式接口 16.3 方法引用与构造器引用 16.4 StreamAPI的使用 16.5 Optiona ...
- Java8的一些新特性
Java8的一些新特性 文章目录 Java8的一些新特性 1.函数式接口 2.Lambda表达式 2.1.介绍 2.2.案例 2.3.案例讲解 3.方法引用 3.1.介绍 3.2.案例 4.Strea ...
- Java基础学习总结(33)——Java8 十大新特性详解
Java8 十大新特性详解 本教程将Java8的新特新逐一列出,并将使用简单的代码示例来指导你如何使用默认接口方法,lambda表达式,方法引用以及多重Annotation,之后你将会学到最新的API ...
- JAVA8 十大新特性详解
JAVA8 十大新特性详解 http://www.jb51.net/article/48304.htm java7和java6比较有什么不同 转载于:https://www.cnblogs.com/y ...
- 【element 】使用xlsx、FileSaver实现导出,CDN引入,FileSaver.saveAs is not a function.saveAs is not a function
系统前端采用element ui,现在需要实现一个导出的功能,各种搜索找到XLsx.FileSaver. CDN方式引入:(网上基本很少CDN引入) <script src="//cd ...
- 深入学习Java8 Lambda (default method, lambda, function reference, java.util.function 包)
Java 8 Lambda .MethodReference.function包 多年前,学校讲述C#时,就已经知道有Lambda,也惊喜于它的方便,将函数式编程方式和面向对象式编程基于一身.此外在使 ...
- java8 group by_java8新特性Java 8 – Stream Collectors groupingBy 示例 - Java教程
在这篇教程中,将向你展示如何使用Java 8 Stream的Collectors,来对一个List进行分组,计算个数,求和以及排序. 1. Group By, Count and Sort 1.1 对 ...
- JAVA8 十大新特性
一.接口的默认方法 Java 8允许我们给接口添加一个非抽象的方法实现,只需要使用 default关键字即可,这个特征又叫做扩展方法,示例如下: 复制代码代码如下: interface Formula ...
最新文章
- Android控件点击圆形阴影反馈解决方案
- C语言字母和数字数量,请问这个用c怎么做:输入一串字符,分别统计其中数字和字母的个数...
- 如何检查对象的类型[iOS/Android/Windows Phone]
- 之江杯2020零样本目标分割题参赛总结
- VBS脚本恶作剧:关机+重启后自动关机
- 一文读懂层次聚类(Python代码)
- nagios监控之(监控配置)
- 如何使用MySQL和JPA使用Spring Boot构建Rest API
- Nginx主配置文件nginx.conf中文详解
- 各层作用_OSI模型中各层在通信中的作用
- vim编辑器操作汇总
- 卫星影像的AI分类与识别 线上Top1
- 拉扎维对于简单CMOS电路的增益计算方法
- web前端制作网页步骤以及制作网页学习教程
- Django restframework中Serializer序列化器-用法详解
- c语言中if函数作用,c语言函数if的用法怎么用
- TPM设备管理学习心得
- 电器元件——LM7805
- overleaf怎么输入中文_【LATEX】在线latex排版工具Overleaf-制作中文简历-详细教程...
- antd 表格分页功能
热门文章
- Android WebView重定向问题,Android Webview重定向问题解决方法
- word更新域后图片错误_你还不知道Word中F1~F12键作用?
- python自动化测试-简单实现接口自动化测试(基于python)
- python简单代码-手把手教你用Python创建简单的神经网络(附代码)
- python 入门基础-Python 如何入门?
- python是什么专业学的-python编程学习需要哪些基础和准备工作?
- 自学python需要安装什么-终于明白python需要学什么
- python练手经典100例-20个Python练手经典案例,能全做对的人确实很少!
- python电脑配置-Python--获取电脑配置信息--设计代码
- 本地离线语音识别芯片哪家强