欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Java8中的Optional类

程序员文章站 2022-06-07 09:07:25
...

在工作室接触到了之前没用过的Optional类,这是Java 8新增的一个类,搜了一下这是用以解决程序中常见的NullPointerException异常问题。那就来记录一下Optional类,以及如何用它消除代码中的null检查。

避免使用null检查

Java开发的过程中,几乎所有人都遇到过NullPointerException异常,大多数人遇到NullPointerException异常时都会在异常出现的地方加上if代码块来判断值不为空,举个例子

public void setUserToRole(User user) {
    if (user != null) {
        Long roleId = user.getRoleId();
        if (roleId != null) {
            Role role = roleService.findRoleByRoleId(roleId);
            if (role != null) {
                role.setUserId(user.getUserId());
                roleDao.save(role);
            }
        }
    }
}

这是一个普通的将用户和对应的角色绑定的方法,用于以后在讲角色和权限进行绑定区分,为了避免出现NullPointerException异常,手动对可能为null值进行了处理,不过代码看起来非常杂,业务逻辑被淹没在if逻辑判断中,可以使用Optional来重构:

public void setUserToRole(User user) {
    Optional<User> userOpt = Optional.ofNullable(user);
    userOpt.ifPresent( u -> {
      Long roleId = u.getRoleId();
      Optional.ofNullable(roleId).ifPresent( rid -> {
        Role role = roleService.findRoleByRoleId(rid);
        Optional.ofNullable(role).ifPresent( r -> {
          r.setUserId(u.getUserId());
          roleService.save(r);
        });
      });
    });
  }

虽然看起来有点怪怪的,但是确实起到了效果哈哈

下面从最开始看看简单的逻辑的例子

创建Optional对象

Optional类提供类三个方法用于实例化一个Optional对象,它们分别为empty()of()ofNullable(),这三个方法都是静态方法,可以直接调用。

of()方法创建一个非空对象

ofNullable()方法用于创建一个可以为空的对象

empty()方法用于创建一个没有值的Optional对象:

User user1 = new User(1, "张三");
Optional<User> userOpt = Optional.of(user1);
Optional<User> userOpt = Optional.ofNullable(user1);
Optional<User> userOpt = Optional.empty();

获取Optional对象的值

通常如果我们要获取User对象中的name属性值,常见的方式是直接获取:

String	name	=	user.getName();

使用Optional中提供的map()方法可以以更简单的方式实现:

userOpt.map(u -> u.getName());
userOpt.map(User::getName);
//两种lambda写法

但是要注意的是,optional操作完得到的依然是Optinal对象,可以使用.get()得到对应类型的数据,比如

String	name	=	userOpt.map(User::getName).get();

orElse()orElseGet()方法

实例对象存在则返回,否则提供默认值或者通过方法来设置返回值,比如

User user1 = new User(1, "张三");
User user2 = null;
Optional<User> userOpt = Optional.ofNullable(user1);
User user = userOpt.orElse(null);
System.out.println(user.getName());  //张三
Optional<User> userOpt = Optional.ofNullable(user2);
User user = userOpt.orElse(new User(1,"李四"));
System.out.println(user.getName());   //李四

isPresent()ifPresent()方法

isPresent()如果非空则返回true,空则返回false

if (userOpt.isPresent()) {
    return userOpt.map(……);
} else {
    return Collections.emptyList();
}

但是不建议这么写,因为这样和Java8之前的语法没有任何区别

if	(user != null) {
````````
}	else	{
````````
}

现在可以换成使用ifPresent进行非空判断

userOpt.ifPresent(System.out::println);

map()方法

上面说到map()用来获取对应的数据,map()还是可以无延伸的,比如获取用户名的大写,没有用户名则为null

user.map(u -> u.getName())
           .map(name -> name.toUpperCase())
           .orElse("null");

要是放在Java8以前是这么写的

User user = .....
if(user != null) {
  String name = user.getUsername();
  if(name != null) {
    return name.toUpperCase();
  } else {
    return null;
  }
} else {
  return null;
}
相关标签: Java8 Optional