Lambda Optional代替if-else

2023-10-20 12:46:04 浏览数 (2)

前言

函数式的编程可以极大的简化逻辑代码的编写,虽然是一种语法糖,但是好用就是好用。 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引发异常。

0 人点赞