Optional类与空指针(下)

简介: Optional是一个可以包含null或者非null的容器对象。根据源码分析方法功能:


1. 定义方法



1.1 empty

返回一个空的Optaional实例,在这个实例中没有值存在。

public static<T> Optional<T> empty() {
    @SuppressWarnings("unchecked")
    Optional<T> t = (Optional<T>) EMPTY;
    return t;
}

1.2 of

返回一个值不能为空的Optional实例,在这个实例中值为null时抛出NPE。

public static <T> Optional<T> of(T value) {
    return new Optional<>(value);
}
private Optional(T value) {
    this.value = Objects.requireNonNull(value);
}

1.3 ofNullable

返回一个值可以为空的Optional实例,在这个实例中值为null时返回一个空的Optaional实例。

public static <T> Optional<T> ofNullable(T value) {
    return value == null ? empty() : of(value);
}

2. 功能方法



2.1 isPresent

如果有值存在,返回true,否则返回false

People people = new People();
System.out.println(Optional.ofNullable(people).isPresent());
// print: true
people = null;
System.out.println(Optional.ofNullable(people).isPresent());
// print: false

2.2 get()

如果有值存在,返回值,否则抛出NoSuchElementException

People people = new People();
System.out.println(Optional.ofNullable(people).get());
// print: People@61bbe9ba
people = null;
System.out.println(Optional.ofNullable(people).get());
// print: Exception in thread "main" java.util.NoSuchElementException: No value present


2.3 orElse

如果有值存在,返回值,否则返回该 orElse 方法参的数,可以用来定义默认值。

String str = null;
String result = Optional.ofNullable(str).orElse("default");
// print: default
System.out.println(result);
2.4 orElseGet


2.4 orElseGet

如果有值存在,返回值,否则返回提供者函数,可以用函数返回值来定义默认值。

String str = null;
String result = Optional.ofNullable(str).orElseGet(() -> "ajn");
// print: ajn
System.out.println(result);


2.5 orElseThrow

如果有值存在,返回值,否则返回函数接口参数提供的异常。

String str = null;
String result = Optional.ofNullable(str).orElseThrow(IllegalArgumentException::new);
// print: Exception in thread "main" java.lang.IllegalArgumentException
System.out.println(result);


2.6 ifPresent

如果有值存在,方法参数提供的函数接口会进行处理,否则不做任何操作。

Optional.ofNullable(getPeople()).ifPresent(people -> {
    System.out.println("the people is nut null: " + people);
});

上面代码等价于:

People people = getPeople();
if (people != null){
    System.out.println("the people is nut null: " + people);
}


2.7 filter

如果有值存在,并且值符合给定的函数条件,返回当前Optional,否则返回一个空的Optaional实例,可以用来过滤特殊值。

String name = "AiJiangnan";
// 给定的条件是字符串包含Ai
String result = Optional.of(name).filter(str -> str.contains("Ai")).orElse("字符串不包含Ai");
System.out.println(result);


2.8 map

如果有值存在,可以将该值的类型转换成其他类型,并返回转换后类型的Optional实例,否则返回一个空的Optaional实例,可以链式判空,非常实用。

People people = null;
String result = Optional.ofNullable(people)
    .map(People::getName)
    .map(String::toUpperCase)
    .orElse("default");
System.out.println(result);

    只有当people对象不为null,并且people.getName()不为null,才返回name全部转换为大写的字符串,否则都返回 default。


    2.9 flatMap

    如果有值存在,可以将该值的类型转换成其他类型,但最终只能转成 Optional 实例,否则返回一个空的Optaional实例。该方法与map方法类似,只是该方法返回的Optional实例由函数参数返回。

    People people = new People();
    people.setName(" ajn ");
    String result = Optional.ofNullable(people)
        .flatMap(peo -> Optional.ofNullable(peo.getName()))
        .flatMap(str -> Optional.of(str.toUpperCase()))
        .orElse("default");
    System.out.println(result);




    目录
    相关文章
    |
    2月前
    |
    C++
    【编码狂想】指针航行,链表魔法,解锁结构体和类的编程幻境
    【编码狂想】指针航行,链表魔法,解锁结构体和类的编程幻境
    63 1
    |
    6天前
    |
    Java
    2022蓝桥杯大赛软件类国赛Java大学B组 左移右移 空间换时间+双指针
    2022蓝桥杯大赛软件类国赛Java大学B组 左移右移 空间换时间+双指针
    15 3
    |
    6天前
    |
    存储 Java C#
    C++语言模板类对原生指针的封装与模拟
    C++|智能指针的智能性和指针性:模板类对原生指针的封装与模拟
    |
    4天前
    |
    C++
    C++职工管理系统(类继承、文件、指针操作、中文乱码解决)
    C++职工管理系统(类继承、文件、指针操作、中文乱码解决)
    7 0
    C++职工管理系统(类继承、文件、指针操作、中文乱码解决)
    |
    11天前
    类与对象\this指针
    类与对象\this指针
    8 0
    |
    25天前
    |
    存储 安全 编译器
    C++进阶之路:探索访问限定符、封装与this指针的奥秘(类与对象_上篇)
    C++进阶之路:探索访问限定符、封装与this指针的奥秘(类与对象_上篇)
    9 0
    |
    2月前
    |
    存储 编译器 C语言
    【C++】类与对象【定义、访问限定符、this指针】
    【C++】类与对象【定义、访问限定符、this指针】
    11 1
    |
    2月前
    |
    存储 编译器 程序员
    从C语言到C++④(第二章_类和对象_上篇)->类->封装->this指针(下)
    从C语言到C++④(第二章_类和对象_上篇)->类->封装->this指针
    14 0
    |
    2月前
    |
    存储 编译器 C语言
    从C语言到C++④(第二章_类和对象_上篇)->类->封装->this指针(中)
    从C语言到C++④(第二章_类和对象_上篇)->类->封装->this指针
    13 0
    |
    2月前
    |
    Java C语言 C++
    从C语言到C++④(第二章_类和对象_上篇)->类->封装->this指针(上)
    从C语言到C++④(第二章_类和对象_上篇)->类->封装->this指针
    18 0