前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Lambda Optional代替if-else

Lambda Optional代替if-else

作者头像
潇洒
发布2023-10-20 12:46:04
3790
发布2023-10-20 12:46:04
举报
文章被收录于专栏:石头岛

前言

函数式的编程可以极大的简化逻辑代码的编写,虽然是一种语法糖,但是好用就是好用。 Optional 这个功能可以用来防止null值给程序带来的异常,提供的API也可以用来简化逻辑代码的编码,简化if-else的编写。

写法比较

常规代码写法

一般写一个业务逻辑时,业务代码需要加很多判断,保证程序的健状性。

代码语言:javascript
复制
public void test() {
  User user = userService.getUser();
  if (user != null) {
    String userName = user.getUserName();
    if (userName != null) {
      return userName.toUpperCase();
    } else {
      return null;
    }
  } else {
    return null;
  }
}

改进后

可以看到,改进后的写法,判空这种操作,直接交给Optional去操作。 解释下面的意思:

  1. Optional.ofNullable(user),接收 user 这个数据,可以允许为null
  2. null值是不会被 map 操作的,直接忽略
  3. orElse,如果 user == null,才会进这个逻辑。 整个流程就等价于改进前的逻辑。
代码语言:javascript
复制
public void test() {
  User user = userService.getUser();
  return Optional.ofNullable(user)
          .map(User::getUserName)
          .map(String::toUpperCase)
          .orElse(User::new);
}

简单的if-else

调整测试数test就可以看到不同的效果。 记住这个固定的if-else套路。

代码语言:javascript
复制
  public static void test1() {
//    String test = "test123";
    String test = null;
    String newValue = Optional
            .ofNullable(test)
            .orElse("newValue");
    System.out.println(newValue);
  }

这个示例多加了一个filter,相当于在if()的中插号里写复杂判断逻辑。

代码语言:javascript
复制
  public static void test2() {
    String test = "test123";
//    String test = "test456";
    String newValue = Optional
            .ofNullable(test)
            .filter(str-> str.equals("test456"))
            .orElse("newValue");
    System.out.println(newValue);
  }

等价if-else写法:

代码语言:javascript
复制
  public static void test2() {
    String test = "test123";
//    String test = "test456";
    if (test != null && test.equals("test456")) {
      System.out.println(test); 
    } else {
      System.out.println("newValue");
    }
  }

isPresent() 使用

isPresent 返回boolean,直觉上应该用if-else来判断一下。但是回头想想,如果需要用if-else来判断,直接用if-else来写不完了,干嘛还使用Optional包一层,多此一举。

反面示例

代码语言:javascript
复制
public String getName(User user){
  Optional<User> u = Optional.ofNullable(user);
  if(!u.isPresent()){
    return "Unknown";
  } else { 
    return u.get().name();
  }
}

正面示例

代码语言:javascript
复制
public String getName(User user){
  return Optional.ofNullable(user)
                 .map(u -> u.name)
                 .orElse("Unknown");
}

总结

在写复杂逻辑时,尽量简化代码,不要让代码太代阅读起来费劲,lambda表达式并不复杂,直正复杂不好读的是正则表达式,这种习惯了之后,写起来效率高,看起来也舒服。 即使不使用lambda表达式,在写代码时也要尽量规避返回null出去。防止代码由于null引发异常。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019-02-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 写法比较
    • 常规代码写法
      • 改进后
        • 简单的if-else
        • isPresent() 使用
          • 反面示例
            • 正面示例
            • 总结
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档