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

  • 初级: Map<String, 普通数据类型>======>通过一个数据可以获取另一个数据
  • 中级: Map<String, 函数/表达式>=======> 通过一个数据可以获取一个方法
  • 高级: Map<String, 模式>=============> 通过一个数据可以获取一个设计

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

(0)

相关推荐

  • java中functional interface的分类和使用详解

    java 8引入了lambda表达式,lambda表达式实际上表示的就是一个匿名的function. 在java 8之前,如果需要使用到匿名function需要new一个类的实现,但是有了lambda表达式之后,一切都变的非常简介. 我们看一个之前讲线程池的时候的一个例子: //ExecutorService using class ExecutorService executorService = Executors.newSingleThreadExecutor(); executorSer

  • Java 8 Function函数式接口及函数式接口实例

    函数式接口(Functional Interface)就是一个有且仅有一个抽象方法,但是可以有多个非抽象方法的接口. 函数式接口可以被隐式转换为lambda表达式. 函数式接口可以现有的函数友好地支持 lambda. 介绍 函数式接口其实就是一个抽象接口类,在Java 8之前已有的函数式接口有以下. java.lang.Runnable java.util.concurrent.Callable java.util.Comparator 等等... 使用方法 其实上述所说的接口类只需要使用Fun

  • Java8中stream和functional interface的配合使用详解

    前言 Java 8 提供了一组称为 stream 的 API,用于处理可遍历的流式数据.stream API 的设计,充分融合了函数式编程的理念,极大简化了代码量. 大家其实可以把Stream当成一个高级版本的Iterator.原始版本的Iterator,用户只能一个一个的遍历元素并对其执行某些操作:高级版本的Stream,用户只要给出需要对其包含的元素执行什么操作,比如"过滤掉长度大于10的字符串"."获取每个字符串的首字母"等,具体这些操作如何应用到每个元素上,

  • underscore之function_动力节点Java学院整理

    因为underscore本来就是为了充分发挥JavaScript的函数式编程特性,所以也提供了大量JavaScript本身没有的高阶函数. bind bind()有什么用?我们先看一个常见的错误用法: 'use strict'; console.log('Hello, world!'); // 输出'Hello, world!' var log = console.log; log('Hello, world!'); // Uncaught TypeError: Illegal invocati

  • bug分支和feature分支_动力节点Java学院整理

    软件开发中,bug就像家常便饭一样.有了bug就需要修复,在Git中,由于分支是如此的强大,所以,每个bug都可以通过一个新的临时分支来修复,修复后,合并分支,然后将临时分支删除. 当你接到一个修复一个代号101的bug的任务时,很自然地,你想创建一个分支issue-101来修复它,但是,等等,当前正在dev上进行的工作还没有提交: $ git status # On branch dev # Changes to be committed: # (use "git reset HEAD <

  • git分支管理_动力节点Java学院整理

    分支就是科幻电影里面的平行宇宙,当你正在电脑前努力学习Git的时候,另一个你正在另一个平行宇宙里努力学习SVN. 如果两个平行宇宙互不干扰,那对现在的你也没啥影响.不过,在某个时间点,两个平行宇宙合并了,结果,你既学会了Git又学会了SVN! 分支在实际中有什么用呢?假设你准备开发一个新功能,但是需要两周才能完成,第一周你写了50%的代码,如果立刻提交,由于代码还没写完,不完整的代码库会导致别人不能干活了.如果等代码全部写完再一次提交,又存在丢失每天进度的巨大风险. 现在有了分支,就不用怕了.你

  • Java8通过Function获取字段名的步骤

    摘要:Java8通过Function获取字段名,解决硬编码,效果类似于mybatis-plus的LambdaQueryWrapper. 本文总共三个步骤: 1.使Function获取序列化能力: 2.通过SFunction获取字段名: 3.建一些业务代码进行测试: 使Function获取序列化能力 import java.io.Serializable; import java.util.function.Function; /** * 使Function获取序列化能力 */ @Function

  • Java分支结构和循环结构原理与用法详解

    本文实例讲述了Java分支结构和循环结构.分享给大家供大家参考,具体如下: 流程控制分类 顺序语句:从上到下按顺序依次执行 分支语句:根据条件不同,执行不同语句 循环语句:重复执行某些动作 单分支条件判断语句 条件语句 只是单独的判断条件是否成立 if选择结构是根据条件判断之后再做处理 语法 if(布尔表达式) { //如果布尔表达式为true将执行的语句 } 注意:条件必须是boolean类型 if只带一条语句可以省略{} 双分支条件判断语句 if...else...需要对条件成立和不成立的情

  • 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&q

  • 妙用Java8中的Function接口消灭if...else

    目录 Function 函数式接口 Supplier供给型函数 Consumer消费型函数 Runnable无参无返回型函数 使用小技巧 处理抛出异常的if 处理if分支操作 如果存在值执行消费操作,否则执行基于空的操作 结尾 在开发过程中经常会使用if...else...进行判断抛出异常.分支处理等操作.这些if...else...充斥在代码中严重影响了代码代码的美观,这时我们可以利用Java 8的Function接口来消灭if...else.... if (...){ throw new R

  • Python分支语句与循环语句应用实例分析

    本文实例讲述了Python分支语句与循环语句应用.分享给大家供大家参考,具体如下: 一.分支语句 1.if else语句 语法: if 条件判断: 执行的语句块1 else : 执行语句块2 当满足条件的时候则执行语句块1 ,不满足条件就执行语句块2 注意:1.条件判断后面要加冒号":": 2.执行语句块需要缩进[4个空格]. else 与 if对齐,else后面要加":",语句块缩进4个空格 ''' 从控制台输入年龄,如果年龄小于18岁,打印"未成年人禁

  • Java8特性之用Stream流代替For循环操作详解

    目录 准备一个实体类 准备一个List集合 传统的for循环 使用Stream流 先声明筛选条件,在遍历 Stream操作 嵌套循环(2层) 准备一个实体类 public class Student { private String name; private int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public int get

  • C语言 分支语句详解分析

    目录 分支语句的分类 1.单分支结构语法形式: 2.双分支结构 3.多分支结构 注意事项 分支语句的分类 在不同的场景,我们常常面临着选择,有时候会在爱情与面包之间选择,有时候会在尊严与生存之间选择,又或者面对琳琅满目的商品时,踌躇不定的选择.总之,选择存在于我们生活的方方面面.但是,万物皆可程序化. 分支语句我们分为三种. 单分支结构 双分支结构 多分支结构 1.单分支结构语法形式: if( 条件表达式 ) { (语句块) } 2.双分支结构 双分支结构的基本形式是: if( 条件表达式) {

  • C语言之选择分支语句详解

    目录 1.if-else语句 1.1 例子与总结 1.2 if与else的配对问题 1.3 if-else代码编写建议 2. switch (case)语句 2.1例子和总结 2.2 switch语句其他知识点 1.if-else语句 1.1 例子与总结 例子: ①只有一个if if (1 == a) { printf("yes\n"); } ②if-else语句 if (1 == a) { printf("yes\n"); } else { printfr(&qu

  • C语言超详细讲解循环与分支语句基础

    目录 写在开始 1. 分支语句 1.1 if语句 1.2 switch 2. 循环语句 2.1 while()语句 2.2 do while()语句 2.3 for 语句 for语句中表达式的省略 break在循环语句中的作用 continue 在循环语句中的应用 总结: 写在开始 在内容开始之前给大家介绍一下在计算机中如何表示真假 0表示假,非0表示真. 1. 分支语句 分支语句也叫做条件选择语句,主要分为if语句和switch语句. 1.1 if语句 if()…{} else if()…{}

  • C语言图文并茂讲解分支语句用法

    目录 一.if 语句分析 二.switch 语句分析 三.小结 一.if 语句分析 if 语句用于根据条件选择执行语句 else 不能独立存在且总是与它最近的 if 相匹配 else 语句后可以接连其他 if 语句 if 语句中零值比较的注意点 bool 型变量应该直接出现于条件中,不要进行比较 变量和 0 值比较时,0 值应该出现在比较符号左边(这条规则可以拓展为任意字面量与变量比较时,字面量应该放在左边,变量放在右边,这样即使手误写成了 = ,编译器也能发现) float 型变量不能直接进行

  • C语言超细致讲解分支语句

    目录 前言 C语言的语句 爱选择的分支家族 无所不能的大哥if 另辟蹊径的小弟switch 前言 从今天开始,我将不间断的为大家分享我学C的历程,今天为大家分享的是分支语句. C语言的语句 C语句可分为以下五类: 1. 表达式语句 2. 函数调用语句 3. 控制语句 4. 复合语句 5. 空语句 今天我要分享的是:控制语句 那么什么是控制语句呢? 简单来说便是控制程序执行流程的,在C语言中有三大家族. 今天先为大家介绍:爱选择的分支家族,后续将为大家介绍一根筋的循环家族和爱转弯的转向家族. 爱选

  • Python分支语句常见的使用方法

    目录 前言 一.单分支语句:if语句 二.二分支语句:if else语句 三.多分支结构:if – elif – else语句 四.嵌套分支结构 前言 Python分支语句,也称为选择语句,体现了程序的选择结构,即对应不同的场景,选择不同的处理方式.当满足某个条件的时候,进行对应的操作,不满足则进行其他的操作. 分支语句可分为单分支.二分支和多分支结构,在所有分支中,只能选择其中一条路径,根据分支条件成立与否决定是否执行.由于只能选择一条路径执行,所以应当充分考虑分支语句的条件的设立规则.下面由

随机推荐