轉自:
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 =https://www.cnblogs.com/java265/p/= 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("沒有查詢的相關資料"));
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/499519.html
標籤:Java
上一篇:RPC學習
