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

 更新时间:2020年09月09日 10:25:44   作者:一马平川1  
这篇文章主要介绍了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, 模式>=============> 通过一个数据可以获取一个设计

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

相关文章

  • Java由浅入深带你精通继承super

    Java由浅入深带你精通继承super

    继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为
    2022-03-03
  • SpringBoot实现全局异常处理方法总结

    SpringBoot实现全局异常处理方法总结

    在项目开发中出现异常时很平常不过的事情,我们处理异常也有很多种方式。本文将详细为大家讲解SpringBoot实现全局异常处理几种方法,感兴趣的可以学习一下
    2022-03-03
  • 教你Springboot如何实现图片上传

    教你Springboot如何实现图片上传

    这篇文章主要介绍了教你Springboot如何实现图片上传,首先大家明白图片上传,需要在数据库定义一个varchar类型的img字段图片字段,本文结合示例代码给大家介绍的非常详细,需要的朋友可以参考下
    2023-07-07
  • Java将图片组合成PDF文件的方法

    Java将图片组合成PDF文件的方法

    这篇文章主要为大家详细介绍了Java将图片组合成PDF文件的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-05-05
  • java报错:“错误:编码GBK 的不可映射字符”解决办法

    java报错:“错误:编码GBK 的不可映射字符”解决办法

    当Java源代码中包含中文字符时,我们在用javac编译时会出现“错误:编码GBK的不可映射字符”,这篇文章主要给大家介绍了关于java报错:“错误:编码GBK 的不可映射字符”的解决办法,需要的朋友可以参考下
    2024-08-08
  • 详解5种Java中常见限流算法

    详解5种Java中常见限流算法

    在高并发系统中,出于系统保护角度考虑,通常会对流量进行限流;不但在工作中要频繁使用,而且也是面试中的高频考点。本文就为大家整理了5种Java中常见限流算法,需要的可以参考一下
    2023-04-04
  • Java中SPI机制的实现详解

    Java中SPI机制的实现详解

    SPI(Service Provider Interface),是 JDK 内置的一种服务提供发现机制,可以用来启用框架扩展和替换组件,下面我们就来看看Java中SPI机制的具体实现
    2024-01-01
  • 兼容Spring Boot 1.x和2.x配置类参数绑定的工具类SpringBootBindUtil

    兼容Spring Boot 1.x和2.x配置类参数绑定的工具类SpringBootBindUtil

    今天小编就为大家分享一篇关于兼容Spring Boot 1.x和2.x配置类参数绑定的工具类SpringBootBindUtil,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-12-12
  • SpringData整合ElasticSearch实现CRUD的示例代码(超详细)

    SpringData整合ElasticSearch实现CRUD的示例代码(超详细)

    本文主要介绍了SpringData整合ElasticSearch实现CRUD的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-07-07
  • mybatis-plus多表关联查询功能的实现

    mybatis-plus多表关联查询功能的实现

    本文给大家介绍mybatis-plus多表关联查询功能的实现代码,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2021-11-11

最新评论