首页 > 其他分享 >Optional 详解

Optional 详解

时间:2023-03-19 12:33:59浏览次数:42  
标签:容器 return value 详解 Optional public op

1 前言

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

为方便用户通过 Lambda 表达式调用 Optional 的方法,部分方法(如:filter、ifPresent、map、orElseGet)需传入函数式接口(如:Predicate、Consumer、Function、Supplier)参数。关于 Lambda 表达式的介绍,详见→Lambda 表达式总结

2 主要属性及构造方法

(1)类定义

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

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

(2)主要属性

//空容器
private static final Optional<?> EMPTY = new Optional<>();

//value 存储容器内唯一元素
private final T value;

(3)构造方法

//无参构造方法:this.value = null
private Optional()

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

3 常用方法

(1)创建容器(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)

(2)容器判空(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);

(3)获取元素(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));

(4)筛选元素(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);

(5)映射元素(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;
	}
});

​ 声明:本文转自Optional 详解

标签:容器,return,value,详解,Optional,public,op
From: https://www.cnblogs.com/zhyan8/p/17232797.html

相关文章

  • Optional Lab: Multiple Variable Linear Regression
      OptionalLab:MultipleVariableLinearRegression¶Inthislab,youwillextendthedatastructuresandpreviouslydevelopedroutinestosupportmu......
  • 正则表达式(Regular Expression)详解
    1前言正则表达式主要用于复杂文本处理,如模式匹配、格式检验、文本替换等。常用的通配符有:^,$,*,.,,-,+,?,&,|,(),[],{}2String中的split()、matches()、r......
  • Java线程池详解
    1使用线程池的好处降低资源消耗:通过重复利用已创建的线程降低线程创建和销毁造成的消耗;提高响应速度:当任务到达时,任务可以不需要等到线程创建就能立即执行;提高线程的......
  • JVM详解
    1JVM运行机制概述JVM运行机制类加载机制:类加载过程由类加载器来完成,即由ClassLoader及其子类实现,有隐式加载和显式加载两种方式。隐式加载是指在使用new等方式创建对......
  • etcd详解
    etcd原理详解etcd概述etcd的特点etcd是一个Go言编写的分布式、高可用的一致性键值存储系统,用于提供可靠的分布式键值存储、配置共享和服务发现等功能etcd具有以下特点:......
  • Android自动化测试框架uiautomator2详解
    1uiautomator2简介​uiautomator2是一种Android自动化测试框架,提供了点击、长按、输入文本、滑动、拖拽、截屏等方法,能够模拟用户的各种动作。用户可以通过控件......
  • tensorflow中交叉熵损失函数详解
    1前言tensorflow中定义了3个交叉熵损失函数:softmax_cross_entropy_with_logits(logits,labels)softmax_cross_entropy_with_logits_v2(logits,labels)sparse_softm......
  • java学习日记20230318-object类详解
    objectClass Object是类Object结构的根。 每个班都有Object作为超类。 所有对象(包括数组)都实现了这个类的方法。equals==和equals的区别==比较运算符,既可以......
  • 关系范式详解
    1前言关系模式规范化过程函数依赖:若Y=f(X),则称X函数决定Y,或Y函数依赖于X,记为:X->Y。在数据库中,通常将X置为关键字,将Y置为非主属性。2范式2.11NF1NF定义:关系的所......
  • Linux 远程数据同步工具详解(rsync)
    一、简介1认识Rsync(remotesynchronize)是一个远程数据同步工具,可通过LAN/WAN快速同步多台主机间的文件。Rsync使用所谓的“Rsync算法”来使本地和远程两个主机之间的文......