开发者社区> 段嗣国> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

Java Optional

简介: 在日常开发中,NPE异常是导致应用程序失败的最常见原因。为了解决空指针异常,Google公司知名的 Guava项目引入了Optional类,它通过使用检查空值的方式来防止代码污染,它鼓励程序员写更干净的代码。
+关注继续查看

前言

image (1).png
在日常开发中,NPE异常是导致应用程序失败的最常见原因。为了解决空指针异常,Google公司知名的 Guava项目引入了Optional类,它通过使用检查空值的方式来防止代码污染,它可以使程序员书写更干净的代码。

Optional概述

Java的Optional类其实是"进口"的,它受Guava的Optional类的启发,在JDK8中引入,Optional实际上是个容器,它可以保存泛型值,或者仅仅保存一个null,它提供了很多方便处理的方法,同时也避免了我们在书写代码的时候,进行大量显式的空值检查了。

Method

ofNullable

Optional.of()、Optional.ofNullable()都是创建Optional对象的,他们的区别of()不允许参数是null,而ofNullable()则可以。

public static void main(String[] args) {
    User user1 =  new User("小明");
    User user2 =  null;
    Optional.of(user1);
    Optional.ofNullable(user2);
}

orElse

主要是用来处理当值为空时候的默认值,如果有值则返回该值,否则返回设置参数值

public static void main(String[] args) {
    User user1 =  new User("小明");
    User user2 =  null;
    User result = Optional.ofNullable(user2).orElse(user1);
    System.out.println(result);
}

map

值映射

public static void main(String[] args) {
    User user =  new User("小明", null);
    Integer age = Optional.ofNullable(user).map(User::getAge).orElse(-1);
}

filter

filter为过滤方法,如果filter方法中的表达式成立,方法会返回当前Optional对象值,否则返回一个值为空的 Optional对象。

public static void main(String[] args) {
    User user =  new User("小明", null);
    Integer age = Optional.ofNullable(user)
        .filter(u -> "小明".equals(u.getName()))
        .map(User::getAge)
        .orElse(-1);
}

isPresent

检查是否有值的另一个选择是ifPresent方法。该方法除了执行检查,还接受一个Consumer参数,如果对象不是空的,就对执行传入的表达式。

public static void main(String[] args) {
    User user =  new User("小明", null);
    Optional.ofNullable(user)
        .filter(u -> "小明".equals(u.getName()))
        .ifPresent(t-> System.out.println(t.getAge()));
}

orElseGet

这个方法会在有值的时候返回值,如果没有值,它会执行作为参数传入的Supplier表达式,并将返回其执行结果。

public static void main(String[] args) {
    User user1 =  null;
    User user2 =  new User("小明", null);
    User result = Optional.ofNullable(user1).orElseGet( () -> user2);
}

orElse和orElseGet区别

Optional对象为空而返回orElse或orElseGet中的默认值时,并无差异,都会执行其中的代码。但Optional对象不为空时,orElse还会执行其中的代码,而orElseGet不会执行。

orElseThrow

值不存在则抛出异常,存在则什么不做。

public static void main(String[] args) {
    User user1 =  null;
    User result = Optional.ofNullable(user1)
        .orElseThrow( () -> new ServiceException());
}

Example

/**
 * 防止从user中取出的数据为空,用Optional赋默认值0
 */
public static void main(String[] args) {
    User user =  new User("小明", null);
    Integer age = null;
    user.setAge(
        Optional.ofNullable(age).orElse(0)
    );
}
/**
* 非空则取其name,否则赋空
*/
public static void main(String[] args) {
    User user1 =  new User("小明", null);
    User user2 =  new User(null, 20);
    user2.setName(
        Optional.ofNullable(user1).map(User::getName).orElse("")
    );
}
/**
 * 多map转换
 */
public static void main(String[] args) {
    Object strObj = String.valueOf("aAvwR");
    Optional.ofNullable(str)
        .map(Object::toString)
        .map(String::toLowerCase)
        .orElse("");
}
/**
 * 根据姓名集合查用户集,如果结果不为空的话,取出地址构成List,否则新建List
 */
List<User> users = userDao.queryUserByNames(request.getNames());

List<String> orderNoList = Optional.ofNullable(users)
    .map(u -> u.stream().map(User::getAddress)
    .collect(Collectors.toList()))
    .orElse(Lists.newArrayList());
/**
 * 先取request实体中的AccountId,没有的话从user中取
 */
Long accountId = Optional.ofNullable(request.getAccountId())
    .orElse(Optional.ofNullable(user)
            .map(User::getAccountId).orElse(null));
/**
* 分页默认值
*/
paging.setOffset(
    (long)Optional.ofNullable(param.getOffset()).orElse(DEFAULT_PAGE_OFFSET)
);
paging.setCount(
    Optional.ofNullable(param.getCount()).orElse(DERAULT_PAGE_COUNT)
);
/**
* 替代IF输出
*/
public static void main(String[] args) {
    final User user = new User("小明");

    Optional.ofNullable(user.getName())
        .filter(StringUtils::isNotBlank)
        .ifPresent(System.out::println);
}

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
Java 8新特性之Optional
在进行日常Java开发中遇见NullPointerException已经算是家常便饭了,有些情况没有考虑到有可能出现空指针异常,尤其是新手,即使考虑到了也要使用if-else去判断是否为空,这样有时候会让代码看上去复杂一些. 现在Java8有了Optional之后,空指针的校验就变得非常的方便和简洁,下面我们就来看看Optional的用法.
0 0
Java 8 - Optional类
Java 8 - Optional类
0 0
Java 8 新特性 Optional 类学习,理解并应用。NullPointerException空值检测
JDK1.8开始引入的特性,Optional 类主要解决空指针异常(NullPointerException)问题。 Optional类是一个可能包含或不包含非空值(可以为null)的容器对象。 如果一个值存在,调用 isPresent()方法将返回true、get()方法将返回该对象。 Optional类提供判断空值的方法,使用其中方法可以不用再显式地进行空值检测。
0 0
JAVA8实战 - Optional工具类(下)
JAVA8实战 - Optional工具类(下)
0 0
JAVA8实战 - Optional工具类(上)
JAVA8实战 - Optional工具类(上)
0 0
Java8新特性——Optional容器类的简单应用
Java8新特性——Optional容器类的简单应用
0 0
JAVA 使用实用的参数判空技巧Optional与@Valid,告别if 和else
JAVA 使用实用的参数判空技巧Optional与@Valid,告别if 和else
0 0
Java - Optional 理解与使用
Java - Optional 理解与使用
0 0
深度解析 Java 的 Optional 类(下)
深度解析 Java 的 Optional 类(下)
0 0
+关注
段嗣国
互联网一线农民工。
文章
问答
文章排行榜
最热
最新
相关电子书
更多
JAVA 应用排查全景图
立即下载
Java工程师必读手册
立即下载
Java应用提速(速度与激情)
立即下载