Java8之Optional用法舉例


一、簡介

Optional 類是一個可以為null的容器對象。如果值存在則isPresent()方法會返回true,調用get()方法會返回該對象。
Optional 是個容器:它可以保存類型T的值,或者僅僅保存null。Optional提供很多有用的方法,這樣我們就不用顯式進行空值檢測。
Optional 類的引入很好的解決空指針異常。

 

二、代碼舉例

import bean.User;
import lombok.extern.slf4j.Slf4j;
import org.junit.Test;
import java.util.*;

@Slf4j
public class OptionalDemo {

    public List<User> getList() {
        List<User> users = new ArrayList<>();
        User user = new User("Tom", 22, "Street #1");
        users.add(user);
        users.add(new User("Michael", 33, "Street #2"));
        users.add(new User("Lily", 25, "Street #3"));
        return users;
    }

    @Test
    public void testOptional() {
        List<User> users = getList();
        User user = users.get(0);

        /*判斷是否為空*/
        Optional<User> optional = Optional.of(user);
        log.info("optional.isPresent(): " + optional.isPresent());

        /*不確定是否為null*/
        User user2 = null;
        Optional<User> optional2 = Optional.ofNullable(user2);
        log.info("optional2.isPresent(): " + optional2.isPresent());

        /*數據為null時給默認值*/
        log.info("optional3.orElse(): " + Optional.ofNullable(user2).orElse(user));
//        通過函數獲取默認值,不為空時不執行
//        log.info("optional3.orElseGet(): " + Optional.ofNullable(user).orElseGet(createUser()));
//        為null時,拋出指定的異常
//        log.info("optional3.orElseGet(): " + Optional.ofNullable(user2).orElseThrow(() -> new IllegalArgumentException("數值不能為空!")));

//        對單個值進行處理
        users.stream().map(x -> x.getName()).forEach(x -> System.out.println("map:" + x));
//        拆分為多個值分別處理
        users.stream().flatMap(x -> Arrays.stream(x.getName().split("o"))).forEach(x -> System.out.println("flatMap:" + x));
    }

    @Test
    public void testComparator() {
        List<User> users = getList();

        /*查詢年齡最大的人*/
        Optional<User> max = users.stream().max(Comparator.comparing(User::getAge));
        log.info("maxAge: " + max.get().toString());

        /*名字最長的人*/
        Optional<String> max2 = users.stream().map(u -> u.getName()).max(Comparator.comparing(String::length));
        log.info("maxStringLength: " + max2.get());
    }

}

 

運行結果:

#testOptional
19:50:34.588 [main] INFO java8.optional.OptionalDemo - optional.isPresent(): true
19:50:34.588 [main] INFO java8.optional.OptionalDemo - optional2.isPresent(): false
19:50:34.588 [main] INFO java8.optional.OptionalDemo - optional3.orElse(): User[name='Tom', age=22, address='Street #1']
map:Tom
map:Michael
map:Lily
flatMap:T
flatMap:m
flatMap:Michael
flatMap:Lily

#testComparator
19:50:34.576 [main] INFO java8.optional.OptionalDemo - maxAge: User[name='Michael', age=33, address='Street #2']
19:50:34.586 [main] INFO java8.optional.OptionalDemo - maxStringLength: Michael

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM