設計協議 相對於 HTTP 的用處,RPC 更多的是負責應用間的通信,所以性能要求相對更高。但 HTTP 協議的數據包大小相對請求數據本身要大很多,又需要加入很多無用的內容,比如換行符號、回車符等; 還有一個更重要的原因是,HTTP 協議屬於無狀態協議,客戶端無法對請求和響應進行關聯,每次請求都需要 ...
轉自:
http://www.java265.com/JavaCourse/202204/2854.html
下文筆者將詳細講述java中Optional對象,如下所示
Optional對象的功能: 可使用最簡化的代碼,並高效的處理NPE(Null Pointer Exception空指針異常)
Optional對象的簡介
Optional類是java為平時判斷對象是否為空時使用
例:
jdk8以前的寫法 User user = new User(); if (null == user){ return "user為null"; } jdk8以後可採用以下寫法 User user = new User(); return Optional.ofNullable(user).orElse("user為null");
Optional對象創建
// 1、創建一個包裝對象值為空的Optional對象 Optional<String> optEmpty = Optional.empty(); // 2、創建包裝對象值非空的Optional對象 Optional<String> optOf = Optional.of("optional"); // 3、創建包裝對象值允許為空也可以不為空的Optional對象 Optional<String> optOfNullable1 = Optional.ofNullable(null); Optional<String> optOfNullable2 = Optional.ofNullable("optional");
Optional.get()方法(返回對象的值)
get()方法是返回一個option的實例值
public T get() { if (value == null) { throw new NoSuchElementException("No value present"); } return value; } 例: User user = new User(); user.setAge(2); Optional.ofNullable(person).get();
Optional.isPresent()方法(判讀是否為空)
isPresent()方法就是會返回一個boolean類型值,如果對象不為空則為真,如果為空則false
public boolean isPresent() { return value != null; } User user = new User(); user.setAge(2); if (Optional.ofNullable(user).isPresent()){ //寫不為空的邏輯 System.out.println("不為空"); }else{ //寫為空的邏輯 System.out.println("為空"); }
Optional.ifPresent()方法(判讀是否為空並返回函數)
如果對象非空,則運行函數體
public void ifPresent(Consumer<? super T> consumer) { //如果value不為空,則運行accept方法體 if (value != null) consumer.accept(value); } 例: User user = new User(); user.setAge(2); Optional.ofNullable(user).ifPresent(p -> System.out.println("年齡"+p.getAge())); 如果對象不為空,則會列印這個年齡,因為內部已經做了NPE(非空判斷),所以就不用擔心空指針異常了
Optional.filter()方法(過濾對象)
filter()方法大致意思是,接受一個對象,然後對他進行條件過濾,如果條件符合則返回Optional對象本身,如果不符合則返回空Optional
public Optional<T> filter(Predicate<? super T> predicate) { Objects.requireNonNull(predicate); //如果為空直接返回this if (!isPresent()) return this; else //判斷返回本身還是空Optional return predicate.test(value) ? this : empty(); } 例: User user = new User(); user.setAge(2); Optional.ofNullable(user).filter(p -> p.getAge()>50);
Optional.map()方法(對象進行二次包裝)
map()方法將對應Funcation函數式介面中的對象,進行二次運算,封裝成新的對象然後返回在Optional中
public<U> Optional<U> map(Function<? super T, ? extends U> mapper) { Objects.requireNonNull(mapper); //如果為空返回自己 if (!isPresent()) return empty(); else { //否則返回用方法修飾過的Optional return Optional.ofNullable(mapper.apply(value)); } } 例 User user = new User(); user.setAge(2); String optName = Optional.ofNullable(user).map(p -> user.getName()).orElse("name為空");
Optional.flatMap()方法(Optional對象進行二次包裝)
map()方法將對應Optional< Funcation >函數式介面中的對象,進行二次運算,封裝成新的對象然後返回在Optional中
public<U> Optional<U> flatMap(Function<? super T, Optional<U>> mapper) { Objects.requireNonNull(mapper); if (!isPresent()) return empty(); else { return Objects.requireNonNull(mapper.apply(value)); } } 例 User user = new User(); user.setAge(2); Optional<Object> optName = Optional.ofNullable(user).map(p -> Optional.ofNullable(p.getName()).orElse("name為空"));
Optional.orElse()方法(為空返回對象)
常用方法之一,這個方法意思是如果包裝對象為空的話,就執行orElse方法里的value,如果非空,則返回寫入對象
public T orElse(T other) { //如果非空,返回value,如果為空,返回other return value != null ? value : other; } 例: User user = new User(); user.setAge(2); Optional.ofNullable(user).orElse(new User("java", 888));
Optional.orElseGet()方法(為空返回Supplier對象)
這個與orElse很相似,入參不一樣,入參為Supplier對象,為空返回傳入對象的.get()方法,如果非空則返回當前對象
public T orElseGet(Supplier<? extends T> other) { return value != null ? value : other.get(); } 例: Optional<Supplier<User>> sup=Optional.ofNullable(User::new); //調用get()方法,此時才會調用對象的構造方法,即獲得到真正對象 Optional.ofNullable(user).orElseGet(sup.get());
Optional.orElseThrow()方法(為空返回異常)
如果為空,就拋出定義的異常
如果不為空返回當前對象
public <X extends Throwable> T orElseThrow(Supplier<? extends X> exceptionSupplier) throws X { if (value != null) { return value; } else { throw exceptionSupplier.get(); } } 例: User user = userService.selectByPhone(request.getPhone()); Optional.ofNullable(user).orElseThrow(() -> new ServiceException("沒有查詢的相關數據"));