Java中的Optional类详细解读

 更新时间:2023年08月23日 11:45:01   作者:little_fat_sheep  
这篇文章主要介绍了Java中的Optional类详细解读,Optional是Java中的一个类,它的作用是用于解决空指针异常的问题,它提供了一些有用的方法,可以帮助我们避免显式进行空值检测,需要的朋友可以参考下

1 前言

Optional 是 Java 8 的新特性,专治空指针异常(NullPointerException, 简称 NPE)问题,它是一个容器类,里面只存储一个元素(这点不同于 Conllection)。

为方便用户通过 Lambda 表达式调用 Optional 的方法,部分方法(如:filter、ifPresent、map、orElseGet)需传入函数式接口

(如:Predicate、Consumer、Function、Supplier)参数。

2 主要属性及构造方法

类定义

Optional 类位于 java.util 包中,类定义如下:

//T 为元素数据类型
public final class Optional<T>

主要属性

//空容器
private static final Optional<?> EMPTY = new Optional<>();
//value 存储容器内唯一元素
private final T value;

构造方法

//无参构造方法:this.value = null
private Optional()
//有参构造方法(value不允许为空):this.value = Objects.requireNonNull(value)
private Optional(T value)

3 常用方法

创建容器(empty、of、ofNullable)

//创建空容器:return (Optional<T>) EMPTY
public static<T> Optional<T> empty()
//创建容器(value不允许为空):return new Optional<>(value)
public static <T> Optional<T> of(T value)
//创建容器(value允许为空):return value == null ? empty() : of(value)
public static <T> Optional<T> ofNullable(T value)

容器判空(isPresent)

//判断容器是否为空:return value != null
public boolean isPresent()
//判断容器是否为空,若不为空,消费元素
public void ifPresent(Consumer<? super T> consumer) {
	if (value != null)
		consumer.accept(value);
}

应用:

Optional<User> op = Optional.of(new User("张三", 20));
op.ifPresent(user -> System.out.println(user));
//op.ifPresent(System.out::println);

获取元素(get、orElse、orElseGet)

//获取容器中唯一元素:return value
public T get()
//获取容器唯一元素,若为空,返回指定值:return value != null ? value : other
public T orElse(T other)
//获取容器唯一元素,若为空,返回供应者(Supplier)提供的元素
public T orElseGet(Supplier<? extends T> other) {
	return value != null ? value : other.get();
}

应用: 

Optional<User> op = Optional.ofNullable(null);
User user = op.orElseGet(() -> new User("张三", 20));

筛选元素(filter)

//过滤不符合断言(Predicate)的元素
public Optional<T> filter(Predicate<? super T> predicate) {
	Objects.requireNonNull(predicate);
	if (!isPresent())
		return this;
	else
		return predicate.test(value) ? this : empty();
}

 应用: 

Optional<User> op = Optional.of(new User("张三", 20));
Optional<User> op2 = op.filter(user -> user.age > 18);

映射元素(map)

//将 T 类型元素映射为 U 类型元素
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));
	}
}

应用: 

Optional<String> op = Optional.of(new String("12345"));
Optional<Integer> op2 = op.map(str -> {
	try {
		return Integer.parseInt(str);
	} catch (Exception e) {
		return -1;
	}
});

到此这篇关于Java中的Optional类详细解读的文章就介绍到这了,更多相关Java的Optional类内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • java中的arrays.sort()代码详解

    java中的arrays.sort()代码详解

    这篇文章主要介绍了Java中的Arrays.sort()代码详解,涉及Arrays.sort()简单示例,策略模式,”super”的使用等相关内容,具有一定借鉴价值,需要的朋友可以参考下。
    2017-12-12
  • 归并算法之有序数组合并算法实现

    归并算法之有序数组合并算法实现

    这篇文章主要介绍了归并算法之有序数组合并算法实现的相关资料,需要的朋友可以参考下
    2017-07-07
  • 浅谈自定义注解在Spring中的应用

    浅谈自定义注解在Spring中的应用

    这篇文章主要介绍了浅谈自定义注解在Spring中的应用,具有一定借鉴价值,需要的朋友可以参考下。
    2017-12-12
  • java实现查找替换功能

    java实现查找替换功能

    这篇文章主要为大家详细介绍了java实现查找替换功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-03-03
  • Java中static关键字的作用解析

    Java中static关键字的作用解析

    这篇文章主要介绍了Java中static关键字的作用解析,Java 中,不能在所有类之外定义全局变量,只能通过在一个类中定义公用、静态的变量来实现一个全局变量,需要的朋友可以参考下
    2023-11-11
  • java Unsafe详细解析

    java Unsafe详细解析

    Unsafe为我们提供了访问底层的机制,这种机制仅供java核心类库使用,而不应该被普通用户使用。但是,为了更好地了解java的生态体系,我们应该去学习它,去了解它,不求深入到底层的C/C++代码,但求能了解它的基本功能。下面小编来和大家一起学习
    2019-05-05
  • Java创建数组的几种方式总结

    Java创建数组的几种方式总结

    下面小编就为大家带来一篇Java创建数组的几种方式总结。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-10-10
  • 详解DES加密算法的原理与Java实现

    详解DES加密算法的原理与Java实现

    DES 加密,是对称加密。对称加密,顾名思义,加密和解密的运算全都是使用的同样的秘钥。这篇文章主要为大家讲讲DES加密算法的原理与Java实现,需要的可以参考一下
    2022-10-10
  • spring动态控制定时任务的实现

    spring动态控制定时任务的实现

    在实际项目中,经常需要动态的控制定时任务,比如通过接口增加、启动、停止、删除定时任务,本文主要介绍了spring动态控制定时任务的实现,感兴趣的可以了解一下
    2024-01-01
  • Java深度优先遍历解决排列组合问题详解

    Java深度优先遍历解决排列组合问题详解

    这篇文章主要介绍了Java深度优先遍历解决排列组合问题详解,深度优先搜索是递归过程,带有回退操作,因此需要使用栈存储访问的路径信息,当访问到的当前顶点没有可以前进的邻接顶点时,需要进行出栈操作,将当前位置回退至出栈元素位置,需要的朋友可以参考下
    2024-01-01

最新评论