案例代码:https://gitee.com/flymini/codes01/tree/master/java_/com-learn-java01
****
java.util.Optional 类可以看做是一个容器,它可以存储任意类型的数据,包括`null`值。引入 java.util.Optional 可以很好的避免空指针异常。
<br/>
常用的方法如下:
**1. `public static<T> Optional<T> empty()`创建一个空的容器**
```java
Optional<String> optional01 = Optional.empty();
Optional<Integer> optional02 = Optional.empty();
```
**2. `public static <T> Optional<T> of(T value)`创建一个存储value的容器**
* 如果`value`为`null`,则报空指针异常 java.lang.NullPointerException。
```java
Optional<String> optional01 = Optional.of("zhangsan");
Optional<Integer> optional02 = Optional.of(1000);
```
**3. `public static <T> Optional<T> ofNullable(T value)`创建一个存储value的容器**
* `value`可以为`null`。
```java
Optional<String> optional01 = Optional.ofNullable("zhangsan");
Optional<String> optional02 = Optional.ofNullable(null);
```
**4. `public T get()`获取容器中存储的数据**
* 如果容器为空,则报空指针异常 java.lang.NullPointerException。
```java
Optional<String> optional01 = Optional.ofNullable("zhangsan");
System.out.println(optional01.get());
//zhangsan
```
**5. `public boolean equals(Object obj)`判断两个容器是否相等**
* 如果两个容器为空,则不论存储的数据类型,它们总是相等的。
* 如果容器不为空,则根据它们存储的值与值的类型是否都相等来判断两个容器是否相同。
```java
Optional<String> optional01 = Optional.empty();
Optional<String> optional02 = Optional.of("zhangsan");
Optional<String> optional03 = Optional.of("1000");
Optional<Integer> optional04 = Optional.empty();
Optional<Integer> optional05 = Optional.of(1000);
//空容器与空容器比较:true
System.out.println(optional01.equals(optional04));
//存储相同数据类型的容器比较:false
System.out.println(optional02.equals(optional03));
//存储不同数据类型的容器比较:false
System.out.println(optional03.equals(optional05));
```
**6. `public Optional<T> filter(Predicate<? super T> predicate)`过滤器**
* 如果容器不为空,则返回符合条件 predicate 的容器。
* 如果容器为空,或者不符合条件 predicate 则返回空的容器。
```java
List<Integer> intList = Arrays.asList(100, 200, 300, 400);
for (Integer value : intList) {
Optional<Integer> optional01 = Optional.ofNullable(value);
//返回容器中数据 <= 200 的容器
Optional<Integer> optional02 = optional01.filter(i -> i <= 200);
System.out.println(optional02.orElse(0));
}
//100
//200
//0
//0
```
**7. `public<U> Optional<U> flatMap(Function<? super T, Optional<U>> mapper)`值映射**
* 可以对容器中的数据做任何操作,然后返回修改数据后的容器。
```java
String numStr = "1000";
Optional<Integer> optional01 = Optional.ofNullable(numStr).flatMap(p -> Optional.ofNullable(Integer.parseInt(numStr)));
Optional<String> optional02 = Optional.ofNullable(numStr).flatMap(p -> Optional.ofNullable("Hello World! " + p));
//true
System.out.println(optional01.get() instanceof Integer);
//Hello World! 1000
System.out.println(optional02.get());
```
**8. `public<U> Optional<U> map(Function<? super T, ? extends U> mapper)`值映射**
* 可以对容器中的数据做任何操作,然后返回修改数据后的容器。
```java
String numStr = "1000";
Optional<Integer> optional01 = Optional.ofNullable(numStr).map(p -> Integer.parseInt(p));
Optional<String> optional02 = Optional.ofNullable(numStr).map(p -> "Hello world! " + p);
//true
System.out.println(optional01.get() instanceof Integer);
//Hello world! 1000
System.out.println(optional02.get());
```
**9. `public void ifPresent(Consumer<? super T> consumer)`容器不为空则调用consumer**
```java
//张三
Optional.ofNullable("张三").ifPresent(p -> System.out.println(p));
```
**10. `public boolean isPresent()`判断容器是否为空**
* 存储的值为`null`则为空。
```java
Optional<String> optional01 = Optional.of("zhangsan");
Optional<Integer> optional02 = Optional.empty();
Optional<Integer> optional03 = Optional.ofNullable(null);
//true
System.out.println(optional01.isPresent());
//false
System.out.println(optional02.isPresent());
//false
System.out.println(optional03.isPresent());
```
**11. `public T orElse(T other)`容器不为空则返回容器中的数据,否则返回other**
```java
Optional<String> optional01 = Optional.ofNullable("zhangsan");
Optional<String> optional02 = Optional.ofNullable(null);
//zhangsan
System.out.println(optional01.orElse("other"));
//other
System.out.println(optional02.orElse("other"));
```
**12. `public T orElseGet(Supplier<? extends T> other)`容器不为空则返回容器中的数据,否则返回调用other的结果**
```java
String optional01 = Optional.ofNullable("zhangsan").orElseGet(() -> "other");
String optional02 = (String) Optional.ofNullable(null).orElseGet(() -> "other");
//zhangsan
System.out.println(optional01);
//other
System.out.println(optional02);
```
**13. `public <X extends Throwable> T orElseThrow(Supplier<? extends X> exceptionSupplier) throws X`容器中存储数据则返回该数据,否则抛出异常X**
```java
String optional01 = Optional.ofNullable("zhangsan").orElseThrow(() -> new Exception("容器为空"));
//zhangsan
System.out.println(optional01);
//抛出异常:java.lang.Exception: 容器为空
String optional02 = (String) Optional.ofNullable(null).orElseThrow(() -> new Exception("容器为空"));
```
**14. `public int hashCode()`返回容器数据的hash值**
```java
Optional<String> optional01 = Optional.ofNullable("zhangsan");
Optional<String> optional02 = Optional.ofNullable(null);
Optional<Boolean> optional03 = Optional.ofNullable(true);
//-1432604556
System.out.println(optional01.hashCode());
//0
System.out.println(optional02.hashCode());
//1231
System.out.println(optional03.hashCode());
```
**15. `public String toString()`返回容器数据的字符串形式**
```java
Optional<String> optional01 = Optional.ofNullable("zhangsan");
Optional<String> optional02 = Optional.ofNullable(null);
Optional<Boolean> optional03 = Optional.ofNullable(true);
//Optional[zhangsan]
System.out.println(optional01.toString());
//Optional.empty
System.out.println(optional02.toString());
//Optional[true]
System.out.println(optional03.toString());
```
- 网络通信
- 网络协议
- 端口和套接字
- TCP网络程序
- UDP网络程序
- 多线程聊天室
- 多线程
- 线程相关概念
- 线程实现方式
- 中断线程
- 线程生命周期
- 线程优先级
- 优先级规则
- 案例演示
- 线程同步机制
- 线程同步机制
- synchronized关键字
- ReentrantLock类
- Condition类
- 监视器概念
- volatile关键字
- final变量
- 死锁
- 线程局部变量
- 读/写锁
- 原子类
- 阻塞队列
- 工作规则
- 案例演示
- 常用阻塞队列
- 线程安全集合
- 高效的映射/集/队列
- 并发集视图
- 写数组的拷贝
- Arrays类的并行数组算法
- 同步包装器
- Callable与Future
- 执行器
- 线程池
- 预定执行
- 控制任务组
- Fork-Join框架
- 同步器
- 同步器
- 信号量
- CountDownLatch类
- CyclicBarrier类
- Exchanger类
- SynchronousQueue类
- 线程与Swing
- Swing与线程问题
- 两个原则
- Swing工作线程
- 单一线程规则
- 文件IO
- File类
- 文件输入输出
- ZIP压缩文件
- 集合
- 集合框架
- 集合接口
- 集合实现类
- 线程安全集合
- 集合算法
- 迭代器
- 集合排序
- JDBC
- JDBC是什么
- JDBC-ODBC桥
- JDBC驱动程序类型
- JDBC常用类与接口
- 数据库操作
- 连接数据库
- 增/删/改/查/预处理
- 事务
- 批处理
- commons-dbutils工具
- 安全问题
- Jedis
- 使用Jedis操作Redis数据库
- JSON转换
- 使用连接池
- 案例
- 单例破坏
- 单例定义
- 单例实现方式
- 懒汉式实现单例
- 饿汉式实现单例
- 单例破坏
- 类的单例破坏
- 枚举的单例破坏
- 克隆
- 克隆是什么
- 浅克隆
- 深克隆
- 注解
- 注解是什么
- 三大注解
- 内置注解
- 元注解
- 自定义注解
- NIO
- 相关概念
- BIO/NIO/AIO
- 多线程编程
- 线程同步
- 线程通信
- NIO
- NIO三大核心组件
- NIO网络编程
- NIO文件读写
- AIO
- Java8新特性
- Lambda表达式
- 方法引用
- 函数式接口
- 默认方法
- 什么是默认方法
- 默认方法语法格式
- 多个同名的默认方法问题
- 静态默认方法
- 默认方法实例
- Stream
- Stream是什么
- Stream示例
- Optional容器
- 新的日期时间API
- Base64
- SPI
- SPI是什么
- SPI与API的区别
- 常见场景
- 使用SPI需遵循的约定
- SPI使用步骤