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)
);
}
}
動手之後,就要經常使用。