范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

实战技巧ifelse代码优化技巧

  在实际的业务开发当中,经常会遇到复杂的业务逻辑,可能部分同学实现出来的代码并没有什么问题,但是代码的可读性很差。本篇文章主要总结一下自己在实际开发中如何避免大面积的 if-else 代码块的问题。补充说明一点,不是说 if-else 不好,而是多层嵌套的 if-else 导致代码可读性差、维护成本高等问题。
    现有如下一段示例代码,部分优化技巧是根据这段代码进行的public class BadCodeDemo {      private void getBadCodeBiz(Integer city, List newDataList, List oldDataList) {         if (city != null) {              if (newDataList != null && newDataList.size() > 0) {                 TestCodeData newData = newDataList.stream().filter(p -> {                     if (p.getIsHoliday() == 1) {                         return true;                     }                     return false;                 }).findFirst().orElse(null);                 if (newData != null) {                     newData.setCity(city);                 }             }          } else {              if (oldDataList != null && newDataList != null) {                 List oldCollect = oldDataList.stream().filter(p -> {                     if (p.getIsHoliday() == 1) {                         return true;                     }                     return false;                  }).collect(Collectors.toList());                 List newCollect = newDataList.stream().filter(p -> {                     if (p.getIsHoliday() == 1) {                         return true;                     }                     return false;                 }).collect(Collectors.toList());                  if (newCollect != null && newCollect.size() > 0 && oldCollect != null && oldCollect.size() > 0) {                     for (TestCodeData newPO : newCollect) {                         if (newPO.getStartTime() == 0 && newPO.getEndTime() == 12) {                             TestCodeData po = oldCollect.stream().filter(p -> p.getStartTime() == 0                                     && (p.getEndTime() == 12 || p.getEndTime() == 24)).findFirst().orElse(null);                             if (po != null) {                                 newPO.setCity(po.getCity());                             }                         } else if (newPO.getStartTime() == 12 && newPO.getEndTime() == 24) {                             TestCodeData po = oldCollect.stream().filter(                                     p -> (p.getStartTime() == 12 || p.getStartTime() == 0)                                             && p.getEndTime() == 24).findFirst().orElse(null);                             if (po != null) {                                 newPO.setCity(po.getCity());                             }                         } else if (newPO.getStartTime() == 0 && newPO.getEndTime() == 24) {                             TestCodeData po = oldCollect.stream().filter(                                     p -> p.getStartTime() == 0 && p.getEndTime() == 24).findFirst().orElse(null);                             if (po == null) {                                 po = oldCollect.stream().filter(                                         p -> p.getStartTime() == 0 && p.getEndTime() == 12).findFirst().orElse(null);                             }                             if (po == null) {                                 po = oldCollect.stream().filter(                                         p -> p.getStartTime() == 12 && p.getEndTime() == 24).findFirst().orElse(null);                             }                             if (po != null) {                                 newPO.setCity(po.getCity());                             }                         } else if (newPO.getTimeUnit().equals(Integer.valueOf(1))) {                             TestCodeData po = oldCollect.stream().filter(                                     e -> e.getTimeUnit().equals(Integer.valueOf(1))).findFirst().orElse(null);                             if (po != null) {                                 newPO.setCity(po.getCity());                             }                         }                     }                 }              }         }     } } 复制代码技巧一:提取方法,拆分逻辑
  比如上面这段代码中if(null != city) {  } else {  } 复制代码
  这里可以拆分成两段逻辑,核心思想就是逻辑单元最小化,然后合并逻辑单元。private void getCityNotNull(Integer city, List newDataList) {     if (newDataList != null && newDataList.size() > 0) {         TestCodeData newData = newDataList.stream().filter(p -> {             if (p.getIsHoliday() == 1) {                 return true;             }             return false;         }).findFirst().orElse(null);         if (newData != null) {             newData.setCity(city);         }     } }  // 合并逻辑流程 private void getBadCodeBiz(Integer city, List newDataList, List oldDataList) {     if (city != null) {         this.getCityNull(city, newDataList);     } else {         //此处代码省略     } } 复制代码技巧二:分支逻辑提前return
  比如 技巧一 中的 getCityNull 方法,我们可以这样写public void getCityNotNull(Integer city, List newDataList) {     if (CollectionUtils.isEmpty(newDataList)) {         // 提前判断,返回业务逻辑         return;     }     TestCodeData newData = newDataList.stream().filter(p -> {         if (p.getIsHoliday() == 1) {             return true;         }         return false;     }).findFirst().orElse(null);          if (null != newData) {         newData.setCity(city);     } } 复制代码技巧三:枚举
  经过 技巧一 和 技巧二 的优化,文章开头的这段代码被优化成如下所示:public class BadCodeDemo {          public void getBadCodeBiz(Integer city, List newDataList, List oldDataList) {         if (city != null) {             this.getCityNotNull(city, newDataList);         } else {             this.getCityNull(newDataList, oldDataList);         }     }      private void getCityNotNull(Integer city, List newDataList) {         if (CollectionUtils.isEmpty(newDataList)) {             // 提前判断,返回业务逻辑             return;         }         TestCodeData newData = newDataList.stream().filter(p -> {             if (p.getIsHoliday() == 1) {                 return true;             }             return false;         }).findFirst().orElse(null);          if (null != newData) {             newData.setCity(city);         }     }      private void getCityNull(List newDataList, List oldDataList) {         // 提前判断,返回业务逻辑         if (CollectionUtils.isEmpty(oldDataList) && CollectionUtils.isEmpty(newDataList)) {             return;         }          List oldCollect = oldDataList.stream().filter(p -> {             if (p.getIsHoliday() == 1) {                 return true;             }             return false;         }).collect(Collectors.toList());          List newCollect = newDataList.stream().filter(p -> {             if (p.getIsHoliday() == 1) {                 return true;             }             return false;         }).collect(Collectors.toList());          // 提前判断,返回业务逻辑         if (CollectionUtils.isEmpty(newCollect) && CollectionUtils.isEmpty(oldCollect)) {             return;         }          for (TestCodeData newPO : newCollect) {             if (newPO.getStartTime() == 0 && newPO.getEndTime() == 12) {                 TestCodeData po = oldCollect.stream().filter(p -> p.getStartTime() == 0                         && (p.getEndTime() == 12 || p.getEndTime() == 24)).findFirst().orElse(null);                 if (po != null) {                     newPO.setCity(po.getCity());                 }             } else if (newPO.getStartTime() == 12 && newPO.getEndTime() == 24) {                 TestCodeData po = oldCollect.stream().filter(                         p -> (p.getStartTime() == 12 || p.getStartTime() == 0)                                 && p.getEndTime() == 24).findFirst().orElse(null);                 if (po != null) {                     newPO.setCity(po.getCity());                 }             } else if (newPO.getStartTime() == 0 && newPO.getEndTime() == 24) {                 TestCodeData po = oldCollect.stream().filter(                         p -> p.getStartTime() == 0 && p.getEndTime() == 24).findFirst().orElse(null);                 if (po == null) {                     po = oldCollect.stream().filter(                             p -> p.getStartTime() == 0 && p.getEndTime() == 12).findFirst().orElse(null);                 }                 if (po == null) {                     po = oldCollect.stream().filter(                             p -> p.getStartTime() == 12 && p.getEndTime() == 24).findFirst().orElse(null);                 }                 if (po != null) {                     newPO.setCity(po.getCity());                 }             } else if (newPO.getTimeUnit().equals(Integer.valueOf(1))) {                 TestCodeData po = oldCollect.stream().filter(                         e -> e.getTimeUnit().equals(Integer.valueOf(1))).findFirst().orElse(null);                 if (po != null) {                     newPO.setCity(po.getCity());                 }             }         }     } } 复制代码
  现在利用 枚举 来优化 getCityNull 方法中的 for 循环部分代码,我们可以看到这段代码中有4段逻辑,总体形式如下: if (newPO.getStartTime() == 0 && newPO.getEndTime() == 12) {     //第一段逻辑 } else if (newPO.getStartTime() == 12 && newPO.getEndTime() == 24) {     //第二段逻辑 } else if (newPO.getStartTime() == 0 && newPO.getEndTime() == 24) {     //第三段逻辑 } else if (newPO.getTimeUnit().equals(Integer.valueOf(1))) {     //第四段逻辑 }      复制代码
  按照这个思路利用枚举进行二次优化,将其中的逻辑封装到枚举类中:public enum TimeEnum {      AM("am", "上午") {         @Override         public void setCity(TestCodeData data, List oldDataList) {             TestCodeData po = oldDataList.stream().filter(p -> p.getStartTime() == 0                     && (p.getEndTime() == 12 || p.getEndTime() == 24)).findFirst().orElse(null);             if (null != po) {                 data.setCity(po.getCity());             }         }     },     PM("pm", "下午") {         @Override         public void setCity(TestCodeData data, List oldCollect) {             TestCodeData po = oldCollect.stream().filter(                     p -> (p.getStartTime() == 12 || p.getStartTime() == 0)                             && p.getEndTime() == 24).findFirst().orElse(null);             if (po != null) {                 data.setCity(po.getCity());             }         }     },     DAY("day", "全天") {         @Override         public void setCity(TestCodeData data, List oldCollect) {             TestCodeData po = oldCollect.stream().filter(                     p -> p.getStartTime() == 0 && p.getEndTime() == 24).findFirst().orElse(null);             if (po == null) {                 po = oldCollect.stream().filter(                         p -> p.getStartTime() == 0 && p.getEndTime() == 12).findFirst().orElse(null);             }             if (po == null) {                 po = oldCollect.stream().filter(                         p -> p.getStartTime() == 12 && p.getEndTime() == 24).findFirst().orElse(null);             }             if (po != null) {                 data.setCity(po.getCity());             }         }     },     HOUR("hour", "小时") {         @Override         public void setCity(TestCodeData data, List oldCollect) {             TestCodeData po = oldCollect.stream().filter(                     e -> e.getTimeUnit().equals(Integer.valueOf(1))).findFirst().orElse(null);             if (po != null) {                 data.setCity(po.getCity());             }         }     };      public abstract void setCity(TestCodeData data, List oldCollect);      private String code;     private String desc;      TimeEnum(String code, String desc) {         this.code = code;         this.desc = desc;     }      public String getCode() {         return code;     }      public void setCode(String code) {         this.code = code;     }      public String getDesc() {         return desc;     }      public void setDesc(String desc) {         this.desc = desc;     } } 复制代码
  然后 getCityNull 方法中 for 循环部分逻辑如下:for (TestCodeData data : newCollect) {     if (data.getStartTime() == 0 && data.getEndTime() == 12) {         TimeEnum.AM.setCity(data, oldCollect);     } else if (data.getStartTime() == 12 && data.getEndTime() == 24) {         TimeEnum.PM.setCity(data, oldCollect);     } else if (data.getStartTime() == 0 && data.getEndTime() == 24) {         TimeEnum.DAY.setCity(data, oldCollect);     } else if (data.getTimeUnit().equals(Integer.valueOf(1))) {         TimeEnum.HOUR.setCity(data, oldCollect);     } } 复制代码
  其实在这个业务场景中使用枚举并不是特别合适,如果在遍历对象时,我们就知道要执行哪个枚举类型,此时最合适,伪代码如下:for (TestCodeData data : newCollect) {       String code = "am";  // 这里假设 code 变量是从 data 中获取的       TimeEnum.valueOf(code).setCity(data, oldCollect); } 复制代码技巧四:函数式接口
  业务场景描述:比如让你做一个简单的营销拉新活动,这个活动投放到不同的渠道,不同渠道过来的用户奖励不一样。现假设在 头条、微信 等渠道都投放了该活动。此时你的代码可能会写出如下形式:@RestController @RequestMapping("/activity") public class ActivityController {     @Resource     private AwardService awardService;      @PostMapping("/reward")     public void reward(String userId, String source) {         if ("toutiao".equals(source)) {             awardService.toutiaoReward(userId);         } else if ("wx".equals(source)) {             awardService.wxReward(userId);         }     } }  @Service public class AwardService {     private static final Logger log = LoggerFactory.getLogger(AwardService.class);      public Boolean toutiaoReward(String userId) {         log.info("头条渠道用户{}奖励50元红包!", userId);         return Boolean.TRUE;     }      public Boolean wxReward(String userId) {         log.info("微信渠道用户{}奖励100元红包!", userId);         return Boolean.TRUE;     } } 复制代码
  看完这段代码,逻辑上是没有什么问题的。但它有一个隐藏的缺陷,如果后期又增加很多渠道的时候,你该怎么办?继续 else if 吗?其实我们可以利用函数式接口优化,当然设计模式也可以优化。这里我只是举例使用一下函数式接口的使用方式。@RestController @RequestMapping("/activity") public class ActivityController {     @Resource     private AwardService awardService;      @PostMapping("/reward")     public void reward(String userId, String source) {         awardService.getRewardResult(userId, source);     } }  @Service public class AwardService {     private static final Logger log = LoggerFactory.getLogger(AwardService.class);     private Map> sourceMap = new HashMap<>();      @PostConstruct     private void dispatcher() {         sourceMap.put("wx", (userId, source) -> this.wxReward(userId));         sourceMap.put("toutiao", (userId, source) -> this.toutiaoReward(userId));     }      public Boolean getRewardResult(String userId, String source) {         BiFunction result = sourceMap.get(source);         if (null != result) {             return result.apply(userId, source);         }         return Boolean.FALSE;     }      private Boolean toutiaoReward(String userId) {         log.info("头条渠道用户{}奖励50元红包!", userId);         return Boolean.TRUE;     }      private Boolean wxReward(String userId) {         log.info("微信渠道用户{}奖励100元红包!", userId);         return Boolean.TRUE;     } } 复制代码
  针对一些复杂的业务场景,业务参数很多时,可以利用 @FunctionalInterface 自定义函数式接口来满足你的业务需求,使用原理和本例并无差别。技巧五:设计模式
    设计模式对于if-else的优化,我个人觉得有些重,但是也是一种优化方式。设计模式适合使用在大的业务流程和场景中使用,针对代码块中的if-else逻辑优化不推荐使用。
  常用的设计模式有:策略模式模板方法工厂模式单例模式
  还是以上面的营销拉新活动为例来说明如何使用。使用技巧一:工厂模式+抽象类定义抽象业务接口public abstract class AwardAbstract {     public abstract Boolean award(String userId); } 复制代码定义具体业务实现类// 头条渠道发放奖励业务 public class TouTiaoAwardService extends AwardAbstract {     @Override     public Boolean award(String userId) {         log.info("头条渠道用户{}奖励50元红包!", userId);         return Boolean.TRUE;     } }  // 微信渠道发放奖励业务 public class WeChatAwardService extends AwardAbstract {     @Override     public Boolean award(String userId) {         log.info("微信渠道用户{}奖励100元红包!", userId);         return Boolean.TRUE;     } } 复制代码利用工厂模式获取实例对象public class AwardFactory {     public static AwardAbstract getAwardInstance(String source) {         if ("toutiao".equals(source)) {             return new TouTiaoAwardService();         } else if ("wx".equals(source)) {             return new WeChatAwardService();         }         return null;     } } 复制代码业务入口处根据不同渠道执行不同的发放逻辑@PostMapping("/reward2") public void reward2(String userId, String source) {     AwardAbstract instance = AwardFactory.getAwardInstance(source);     if (null != instance) {         instance.award(userId);     } } 复制代码使用技巧二:策略模式+模板方法+工厂模式+单例模式
  还是以营销拉新为业务场景来说明,这个业务流程再增加一些复杂度,比如发放奖励之前要进行 身份验证、风控验证 等一些列的校验,此时你的业务流程该如何实现更清晰简洁呢!定义业务策略接口/** 策略业务接口 */ public interface AwardStrategy {     /**      * 奖励发放接口      */     Map awardStrategy(String userId);      /**      * 获取策略标识,即不同渠道的来源标识      */     String getSource(); } 复制代码定义奖励发放模板流程public abstract class BaseAwardTemplate {     private static final Logger log = LoggerFactory.getLogger(BaseAwardTemplate.class);      //奖励发放模板方法     public Boolean awardTemplate(String userId) {         this.authentication(userId);         this.risk(userId);         return this.awardRecord(userId);     }      //身份验证     protected void authentication(String userId) {         log.info("{} 执行身份验证!", userId);     }      //风控     protected void risk(String userId) {         log.info("{} 执行风控校验!", userId);     }      //执行奖励发放     protected abstract Boolean awardRecord(String userId); } 复制代码实现不同渠道的奖励业务@Slf4j @Service public class ToutiaoAwardStrategyService extends BaseAwardTemplate implements AwardStrategy {     /**      * 奖励发放接口      */     @Override     public Boolean awardStrategy(String userId) {         return super.awardTemplate(userId);     }      @Override     public String getSource() {         return "toutiao";     }      /**      * 具体的业务奖励发放实现      */     @Override     protected Boolean awardRecord(String userId) {         log.info("头条渠道用户{}奖励50元红包!", userId);         return Boolean.TRUE;     } }   @Slf4j @Service public class WeChatAwardStrategyService extends BaseAwardTemplate implements AwardStrategy {     /**      * 奖励发放接口      */     @Override     public Boolean awardStrategy(String userId) {         return super.awardTemplate(userId);     }      @Override     public String getSource() {         return "wx";     }      /***      * 具体的业务奖励发放实现      */     @Override     protected Boolean awardRecord(String userId) {         log.info("微信渠道用户{}奖励100元红包!", userId);         return Boolean.TRUE;     } } 复制代码定义工厂方法,对外统一暴露业务调用入口@Component public class AwardStrategyFactory implements ApplicationContextAware {     private final static Map MAP = new HashMap<>();      @Override     public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {         Map beanTypeMap = applicationContext.getBeansOfType(AwardStrategy.class);         beanTypeMap.values().forEach(strategyObj -> MAP.put(strategyObj.getSource(), strategyObj));     }      /**      * 对外统一暴露的工厂方法      */     public Boolean getAwardResult(String userId, String source) {         AwardStrategy strategy = MAP.get(source);         if (Objects.isNull(strategy)) {             throw new RuntimeException("渠道异常!");         }         return strategy.awardStrategy(userId);     }      /**      * 静态内部类创建单例工厂对象      */     private static class CreateFactorySingleton {         private static AwardStrategyFactory factory = new AwardStrategyFactory();     }      public static AwardStrategyFactory getInstance() {         return CreateFactorySingleton.factory;     } } 复制代码业务入口方法@RestController @RequestMapping("/activity") public class ActivityController {       @PostMapping("/reward3")     public void reward3(String userId, String source) {         AwardStrategyFactory.getInstance().getAwardResult(userId, source);     } } 复制代码
  假如发起请求: POST http://localhost:8080/activity/reward3?userId=fei&source=wx2022-02-20 12:23:27.716  INFO 20769 --- [nio-8080-exec-1] c.a.c.e.o.c.p.s.BaseAwardTemplate        : fei 执行身份验证! 2022-02-20 12:23:27.719  INFO 20769 --- [nio-8080-exec-1] c.a.c.e.o.c.p.s.BaseAwardTemplate        : fei 执行风控校验! 2022-02-20 12:23:27.719  INFO 20769 --- [nio-8080-exec-1] a.c.e.o.c.p.s.WeChatAwardStrategyService : 微信渠道用户fei奖励100元红包! 复制代码其他技巧使用三目运算符相同业务逻辑提取复用

阜平县委网信办联合阜平县委党校开展网络安全宣传进农村活动为切实提高广大人民群众的网络安全意识和安全防护技能,帮助人民群众有效预防和应对网络安全事故的发生,打造稳定可靠的网络安全环境。9月23日,阜平县委网信办阜平县委党校开展网络安全宣传夯实云计算基础,加快数字化转型进程数字经济已经成为全球经济发展的新动能,产业数字化成为数字经济发展的重要内核,云计算则成为助力数字化转型的重要基石。在近日举行的2021年岭南科学论坛系列活动中,重点提出要强化数字经在云中确保安全的五个技巧在当今的混合工作环境中,云安全比以往任何时候都更加重要。无论企业是否做好准备,新冠疫情都开启了企业采用云服务的新时代。当然,一些企业在2020年初之前就已经踏上了云之旅,但有明确的分享几件提升家居幸福感的好物整个国庆期间我是哪也没去,就在家里待着了,除了看看电影,陪陪老婆孩子,就是清理下家里卫生啥的,也顺带着梳理了下近期入手的一些东西,有几件是我觉得确实能够提升家居幸福感的好物,这里和与其说是回音壁,不如说是扁平的2。0有源音箱,惠威M200Bar不论是工作还是写小说,又或者是开车的过程中,我都习惯了随时有音乐相伴。而自打同事用私房钱买的一对惠威M200音箱换工位时没敢搬回家,放到我那被我白嫖了半年以后,我就对惠威的M系列音适合短途旅行出差的EDC好物分享我买东西的时候,准确的说是价格超过一百块的东西时,都会按照从强需求到弱需求的顺序给自己列上一个表格,然后找预算内最能满足强需求,努力兼顾弱需求的东东,下面这些东西都是我经过这么一番筑牢数字安全屏障如今的网络安全,内涵和外延不断拓展,不仅关乎个人安全企业安全,也关乎国家安全,已经成为社会治理国家治理的重要议题网络安全威胁是全天候无间断的,只有坚持驰而不息久久为功,才能不断织密EPM业财一体风头渐起,FONE如何突破财务数字化的边界?传统的财务服务,早已不再是企业孜孜以求的目标。那个驼着背弯着腰端着水杯戴着老花镜的账房先生,绝不再是财务的形象代言。如今,财务已经融入企业的各项业务活动之中,成为企业管理者进行业务小身材蕴含大能量,让音质得到一耳朵提升的BlueminiR2R大家好,我是手撕鲈鱼,一个经常被误认为体育老师的小学网管。小说动作电影和音乐算是我的三大爱好,而音乐方面算是投入比较多的,先后经手过的耳机怎么也有几十款了,还不算蹭听的其他烧友的存榆林WEYVV7热销中,限时特惠1。5万元公司里忙不完的项目,每日地铁口的拥堵,没有个人空间怎么办?我要买WEYVV7,我要买WEYVV7,我要买WEYVV7。重要的事情说三遍!近日,榆林亿荣WEY店WEYVV7销售,颜色手机修图APPSnapseed全新的体验创意篇(四)创意功能篇四许多人都会使用Snapseed修图,但是对于那些想使用相框的就很失望了,就那么几个干巴巴的样式,根本不够用的。我就想了,能不能根据现有的工具开发出更多的相框,真是功夫不
华为将发布新款折叠屏手机MateXs2,折叠方案引关注新京报贝壳财经讯(记者许诺)4月22日上午,华为终端官方微博宣布将于4月28日举办华为折叠旗舰及全场景新品发布会,发布新款折叠旗舰华为MateXs2。华为常务董事终端BGCEO余承如何看待realme真我Q5系列1199元的起售价,这个定价策略怎样?4月20日1400,realme真我Q5系列正式发布,本次共带来3个版本真我Q5Pro,搭载80W超速闪充5000mAh超大电池骁龙8705G处理器120Hz三星E4旗舰屏,同时拥RedmiNote12系列入网首次搭载旗舰级芯片消息称此次公布的两款机型均为RedmiNote12Pro系列的高配版,具体规格如下RedmiNote12Pro型号为22041216C,正面采用一块6。6英寸屏幕,内置电池额定容量机器人在线特约系列之一国产机器人快换盘到底安不安全?机器人快换盘,行业内又叫换枪盘,快换装置,快速更换器快换器等,它是应用在工业机器人末端的一种柔性连接工具,是工业机器人应用系统中非常重要的组成部分,其作用是让单台工业机器人在应用过地平线来了,领航辅助驾驶壁垒破了万博发自副驾寺智能车参考公众号AI4Auto高速领航辅助,高速环路上车辆自主驾驶变道避让进出匝道的智能驾驶方案。刚刚迎来一个新玩家,还是软硬结合的那种。而且,这次的玩家有点特别,不爱奇艺换LOGO了一提到科技或互联网公司,你首先联想到的颜色是什么?相信大多数人都会联想到蓝色。虽然蓝色占据了大多数互联网大厂的品牌主色调,但对于用户来说,这些颜色相似的产品或服务有时候真的是很难让起底乐视贾跃亭为什么造不出法拉第未来FF91,分析始末目前身居美国的贾跃亭先后创办了乐视电视,乐视手机,乐视影业,直到后来的乐视汽车。乐视超级电视售价很低,买电视还送三年会员既获得了关注度,又提升了销量,后来2016年乐视手机发布销量Alphabet(字母控股)旗下子公司谷歌是一家美国跨国科技公司,专注于人工智能搜索引擎在线广告云计算计算机软件量子计算电子商务和消费电子产品。由于在人工智能领域的市场主导地位数据收集和技术优势,它被称为世界上最强大的贾跃亭FF91不畏人言,一切都会如约而至最近关于贾跃亭以及法拉第未来的各种言论接踵而至,真真假假,虚虚实实。可谓是好不热闹,总有一种墙倒众人推的感觉。2022年对于贾跃亭来说可谓是喜忧参半。还记得2022年2月24日FF首个云南籍数字人云诗洋诞生掌上春城讯日前,由云南升维科技研发出品的云南首个虚拟数字人云诗洋正式发布。云诗洋的研发核心技术创意环节都由云南本土科技团队完成,全链条自主可控。未来云诗洋将应用于云南公益宣传直播带一个数学博士的深度学习方法(第7部分)到目前为止,我们已经讨论了MLPCNN和RNN架构。这些是判别模型,即可以做出预测的模型。前面,我们连载了六次数学博士的深度学习方法(点击直达)一个数学博士的深度学习方法(第6部分