Java8 Optional使用总结

文章目录

  • 一、介绍
  • 二、模拟数据
  • 三、Optional的构造方式
    • 1、Optional.ofNullable(T)
    • 2、Optional.of(T)
    • 3、Optional.empty()
  • 四、Optional的使用
    • 1、map
    • 2、ifPresent
    • 3、orElse
    • 4、orElseGet
    • 5、filter
    • 6、flatMap
    • 7、orElseThrow

一、介绍

Optional 类是一个可以为null的容器对象。如果值存在则isPresent()方法会返回true,调用get()方法会返回该对象。

Optional 是个容器:它可以保存类型T的值,或者仅仅保存null。Optional提供很多有用的方法,这样我们就不用显式进行空值检测。

Optional 类的引入很好的解决空指针异常。

二、模拟数据

用户信息:

public class User {
    /**
     * id
     **/
    private Integer id;

    /**
     * 用户code
     **/
    private String userCode;

    /**
     * 用户姓名
     **/
    private String userName;

    /**
     * 用户性别
     **/
    private Integer sex;

    /**
     * 用户角色
     **/
    private Role role;
}

用户角色信息:

public class Role {
    /**
     * id
     **/
    private Integer id;

    /**
     * 用户code
     **/
    private String userCode;

    /**
     * 角色code
     **/
    private String roleCode;

    /**
     * 角色名字
     **/
    private String roleName;
}

三、Optional的构造方式

1、Optional.ofNullable(T)

该方式的入参可以为null,当入参不确定为非null时使用。

public static void main(String[] args) {
		//user不确定是非null
        User user = xxx;

        Optional<User> userOptional = Optional.ofNullable(user);
    }

2、Optional.of(T)

该方式的入参不能为null,否则会有NPE,在确定入参不为空时使用该方式。

public static void main(String[] args) {
        User user = new User();
        user.setId(1);
        user.setUserCode("U123456");
        user.setUserName("张三");
        user.setSex(1);

        Role role = new Role();
        role.setId(1);
        role.setUserCode("U123456");
        role.setRoleCode("R123456");
        role.setRoleName("管理员");
        user.setRole(role);
		
		//user肯定是非空的,不为空的不能使用of,会抛异常
        Optional<User> userOptional = Optional.of(user);
    }

3、Optional.empty()

这种方式是返回一个空Optional,等效Optional.ofNullable(null)

四、Optional的使用

1、map

场景一:获取用户角色名称
if写法:

	/**
     * 获取用户角色名称
     **/
    private String getUserRoleName(User user) {
        if (Objects.nonNull(user)) {
            Role userRole = user.getRole();
            if (Objects.nonNull(userRole)) {
                return userRole.getRoleName();
            }
        }

        return null;
    }

Optional写法

	/**
     * 获取用户角色名称Optional
     **/
    private String getUserRoleNameOptional(User user) {
        return Optional.ofNullable(user).map(u -> u.getRole()).map(r -> r.getRoleName()).orElse(null);
    }

场景二:如果用户存在返回用户名,不存在返回李四
if写法:

private String getUserRoleName(User user) {
        if (Objects.nonNull(user)) {
            return user.getUserName();
        }

        return "李四";
    }

Optional写法:

private String getUserRoleNameOptional(User user) {
        return Optional.ofNullable(user).map(u -> u.getUserName()).orElse("李四");
    }

2、ifPresent

场景:如果user存在,则把user姓名改为李四,不存在不做处理

Optional.ofNullable(user).ifPresent(u -> {
            u.setUserName("李四");
        });

3、orElse

存在即返回, 无则提供默认值

Optional.ofNullable(user).orElse(null);

4、orElseGet

存在即返回, 无则由函数来产生

Optional.ofNullable(user).orElseGet(()-> xxx逻辑处理);

5、filter

如果有值并且满足条件返回包含该值的Optional,否则返回空Optional

Optional.ofNullable(user).filter(u -> u.getSex() > 18)

6、flatMap

flatMap与map方法类似,区别在于flatMap中的返回值必须是Optional。调用结束时,flatMap不会对结果用Optional封装

Optional<Role> optionalRole = Optional.ofNullable(user).flatMap(u -> Optional.of(u.getRole()));

7、orElseThrow

有值时直接返回, 无值时抛出想要的异常.

Optional.of(user).orElseThrow(() -> new RuntimeException("错误"));

你可能感兴趣的:(技术总结,java)