https://www.jianshu.com/p/00fa8597d0c7
https://www.cnblogs.com/zhangboyu/p/7580262.html
光看不行,得动手
package com.dudu.java8.read;
import com.dudu.User;
import org.springframework.web.servlet.handler.UserRoleAuthorizationInterceptor;
import javax.swing.text.html.Option;
import java.util.Optional;
/**
* 用optional 取代null
*
* @create: 20190412
* @author: liu
**/
public class Read10 {
/**
* Optional 只是对类简单封装
* 变量不存在时,缺省的值会被建模成一个空的optional对象
* 由empty 返回
* <p>
* 帮助更好的设计出合适的api,看到方法签名,就能了解它是否接收一个option的值
*
* @create: 2019-04-12
* @author: liu
**/
public static void main(String[] args) {
Optional<Object> empty = Optional.empty(); // 声明一个空的optional
User user = new User();
Optional<User> user1 = Optional.of(user);
// 依据一个非空值创建一个optional对象
// 如果是个null,就会立即抛出一个NullPointerException
user.setId(123L);
user.setUsername("liu");
Optional<User> user2 = Optional.ofNullable(user);
// 可以接收null的optional
Optional<String> s = user2.map(User::getUsername);
System.out.println(s.get());
Optional<User> user3 = Optional.ofNullable(new User());
Long aLong = user3.map(User::getId).orElse(111L); // 如果为空就设置一个默认值
System.out.println(aLong);
// flatMap 将一个两层的optional对象合并在一起
// 对一个空的optional进行操作不会发生任何改变,返回值也是个空的optional对象
// 调用链上的任何一个方法返回一个空的optional,那么就过就为空
/**
* 默认方法
*
* get 如果变量存在就返回,否则抛出nosuchelementexception
*
* orElse 对象不包含值时,提供一个默认值
*
* orElseGet 是延迟调用版,Supplier方法只有optional不为空时才进行调用
*
* orElseThrow optional为空时 抛出一个异常
*
* ifPresent 变量值存在的时候执行操作
*
* @create: 2019-04-12
* @author: liu
**/
user3.get().setUsername("hua");
// Optional<Long> id1 = Optional.of(user3.get().getId());
// 传入的值为空时会报错
Long id = Optional.ofNullable(user3.get().getId()).orElseGet(() -> user3.get().getId());
System.out.println(id);
user3.get().setId(222L);
Long id2 = Optional.ofNullable(user3.get().getId()).orElseGet(() -> user3.get().getId());
System.out.println("set : " + id2.toString());
// id 存在就输出
Optional.ofNullable(user3.get().getId()).ifPresent((x) -> System.out.println("ifPresent : " + x));
//email 不存在就不执行操作
Optional.ofNullable(user3.get().getEmail()).ifPresent((x) -> System.out.println(x));
Optional<User> user4 = Optional.ofNullable(new User());
// Optional.ofNullable(user4.get().getId()).orElseThrow(RuntimeException::new);
// 没有id 就会抛出一个运行时异常,也可以是自定义的异常
// 包含值也会返回true
System.out.println(" isPresent : " + Optional.ofNullable(user3.get().getId()).isPresent());
// 对user3的id进行过滤 , 如果=222 就打印user3
user3.filter( x -> "222".equals(user3.get().getId().toString())).ifPresent(
x-> System.out.println(x)
);
}
}
动手之后,就要经常使用。