[log] Java8 optional,一次操作,多次練習

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)
        );
    }

}

動手之後,就要經常使用。

在這裏插入圖片描述

在這裏插入圖片描述

在這裏插入圖片描述

在這裏插入圖片描述
在這裏插入圖片描述在這裏插入圖片描述在這裏插入圖片描述在這裏插入圖片描述在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章