美文网首页
用Optional取代null

用Optional取代null

作者: 炮灰向前冲啦 | 来源:发表于2018-03-07 11:02 被阅读0次

创建Optional对象

Optional.empty():声明一个空Optional

Optional<Car> optCar = Optional.empty();

Optional.of():依据一个非空值创建Optional

Optional<Car> optCar = Optional.of(car);

Optional.ofNullable:可接受null的Optional

Optional<Car> optCar = Optional.ofNullable(car);

读取Optional对象

orElse():Optional对象不包含值时提供一个默认值

Optional.of("Hello").orElse("World");  // Hello
Optional.ofNullable(null).orElse("World");  // World

orElseGet():Optional对象不包含值时执行get调用,延迟加载

Optional.of("Hello").orElseGet(() -> new String("World"));  // Hello
Optional.ofNullable(null).orElseGet(() -> new String("World"));  // World

orElseThrow():Optional对象为空时抛出一个异常

Optional.ofNullable("Hello").orElseThrow(() -> new RuntimeException());  // Hello
Optional.ofNullable(null).orElseThrow(() -> new RuntimeException());  // RuntimeException

ifPresent():Optional对象值存在时,执行后续;否则不进行任何操作。ifPresent()方法用来代替null空值判断

Optional.ofNullable("Hello").ifPresent(x -> System.out.println(x));  //Hello
Optional.ofNullable(null).ifPresent(x -> System.out.println(x));  // 无

转换Optional对象

map():map操作会将提供的函数应用于流的每个元素。你可以把Optional对象看成一种特殊的集合数据,它至多包含一个元素。如果Optional包含一个值,那函数就将该值作为参数传递给map,对该值进行转换。如果Optional为空,就什么也不做

map入参是Function,用于 T->U ,最后的返回值用Optional.ofNullable()包装

public<U> Optional<U> map(Function<? super T, ? extends U> mapper) {
    Objects.requireNonNull(mapper);
    if (!isPresent())
        return empty();
    else {
        return Optional.ofNullable(mapper.apply(value));
    }
}

示例。先返回user,map转换成name,最后map转换成小写,返回name的小写String

Optional<String> username = Optional
                .ofNullable(getUserById(id))
                .map(user -> user.getUsername())
                .map(name -> name.toLowerCase());

flatMap():和map()功能类似。区别是map()方法的Function形式是 T->U;flatMap()方法的Function形式是 T->Optional<U>

public<U> Optional<U> flatMap(Function<? super T, Optional<U>> mapper) {
    Objects.requireNonNull(mapper);
    if (!isPresent())
        return empty();
    else {
        return Objects.requireNonNull(mapper.apply(value));
    }
}

示例。区别于上面的map示例:Optional.of

Optional<String> username = Optional
                .ofNullable(getUserById(id))
                .flatMap(user -> Optional.of(user.getUsername()))
                .flatMap(name -> Optional.of(name.toLowerCase()));

filter():接受一个Predicate来对Optional中包含的值进行过滤。如果包含的值满足条件,那么还是返回这个Optional;否则返回Optional.empty()

public Optional<T> filter(Predicate<? super T> predicate) {
    Objects.requireNonNull(predicate);
    if (!isPresent())
        return this;
    else
        return predicate.test(value) ? this : empty();
}

示例。当user.getId()<10时,进行后续的map操作,否则返回Optional.empty()

Optional<String> username = Optional
                .ofNullable(getUserById(id))
                .filter(user -> user.getId() < 10)
                .map(user -> user.getUsername());

相关文章

  • 用Optional取代null

    创建Optional对象 Optional.empty():声明一个空Optional Optional.of()...

  • 用Optional取代null

    null引发的问题以及为什么要避免null引用 先看一个例子 意思也就是说获取一个人的车的保险公司的名称。可以看到...

  • Optional 取代 null?

    我们在平时编程的时候,遇到的一类Exception 要数 NullPointException, 所以我们很经常...

  • 利用Optional取代null

    由于Optional未能实现Serializable接口,若使用了某些要求序列化的库或者框架,在域模型中使用Opt...

  • java8-用Optional取代null

    Optional的主要作用:预防 Java 中著名的 NullPointerException 异常 NullPo...

  • Java8 用Optional取代null

    避免用null来表示变量的缺失! 带来的问题: java.util.Optional 在对象模型中使用Opt...

  • Java8笔记(5)

    Java8笔记(5) 用 Optional 取代 null 如何为缺失的值建模 假设你需要处理下面这样的嵌套对象,...

  • java8(六)用 Optional 取代 null

    一、null带来了哪些问题? 1)NullPointerException 是目前Java程序开发中最典型的异常。...

  • JDK8特性与使用手记

    新特性总览 lambda表达式 Stream操作数组 Optional取代null 简洁的并发编程 LocalDa...

  • JDK8新特性之Optional

    Optional是什么 java.util.Optional Jdk8提供Optional,一个可以包含null值...

网友评论

      本文标题:用Optional取代null

      本文链接:https://www.haomeiwen.com/subject/vuqjfftx.html