1. 程式人生 > 實用技巧 >java8 Optional 類

java8 Optional 類

package jdk180reduce;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional; import test.Teacher;
import test.User; public class optional { /**
* 1.Optional的用法,可以,用了reduce計算,也可以不判斷非null
* 2.三個方法:Optional.empty(), Optional.of, Optional.ofNullable
* 3.orElse()用法
* 4.ifPresent()區別isPresent()
* 5.orElse和orElseGet()不同*/
public static void main(String[] args) { emptyOptional();
orelse();
orelseDifferent();
whenMap_thenOk(); List<Student> stuList = new ArrayList<>(4);
stuList.add(new Student("劉一", 59));
stuList.add(new Student("陳二", 58));
stuList.add(new Student("張三", 98));
stuList.add(new Student("吳九", 100)); //計算分數在60分一下的分數總和 注意:以前沒有60分以下的,不加判斷就會出現空指標異常: score.orElse(0)= 有值取值,無值為0
Optional<Integer> score = stuList.stream().map(Student :: getScore).filter(s -> s<60).reduce((a,b) -> a+b);
System.out.println("score="+score.orElse(0)); // Map<Integer,String> map = new HashMap<>();
map.put(20180001,"章子");
map.put(20180002,"小米");
map.put(20180003,"大黃"); String name = Optional.ofNullable(map.get(20180001)).orElse("無");
System.out.println(name); //無 } public static void emptyOptional() {
// 以下會導致空指標:No value present
// Optional<User> emptyOpt = Optional.empty();
// emptyOpt.get(); //當用.of的時候必須不為null,否則也會報空指標
User user = new User();
Optional<User> opt = Optional.of(user);
opt.get(); //如果不確定傳入的值是否為null,用ofNullable
Object opf = Optional.ofNullable(null).orElse("null");
System.out.println(opf); //ofNullable方法也要isPresent判斷是否有值,或者用.orElse賦值
String name = "John";
Optional<String> opu = Optional.ofNullable(null);
if (opu.isPresent()) {
System.out.println(opu.get());
} else {
System.out.println("opu無值");
} //ifPresent區別isPresent,是用labam表示式
Optional<String> opp = Optional.ofNullable(name);
opp.ifPresent(it -> System.out.println(opp.get()));
} public static void orelse() { //orElse:如果有值則返回該值user,否則返回傳遞給它的引數值user2:
User user = null;
User user2 = new User();
user2.setUserId(2);
User result = Optional.ofNullable(user).orElse(user2);
System.out.println("result="+result);
} /**
* orElse和orElseGet()不同
*/
public static void orelseDifferent() { User user = null;
System.out.println("1----Using orElse");
User result = Optional.ofNullable(user).orElse(createNewUser());
System.out.println("1----Using orElseGet");
User result2 = Optional.ofNullable(user).orElseGet(() -> createNewUser()); User user4 = new User();
user4.setAge(2);
System.out.println("2----Using orElse");
User result4 = Optional.ofNullable(user4).orElse(createNewUser());
System.out.println("result4====="+result4); System.out.println("2----Using orElseGet");
User result3 = Optional.ofNullable(user4).orElseGet(() -> createNewUser());
System.out.println("result3===="+result3); //結論:兩個 Optional物件都包含非空值,兩個方法都會返回對應的非空值。
//不過,orElse() 方法仍然建立了 User 物件。 與之相反,orElseGet() 方法不建立 User 物件。
//在執行較密集的呼叫時,比如呼叫 Web 服務或資料查詢,這個差異會對效能產生重大影響。
} private static User createNewUser() {
System.out.println("Creating New User");
User user = new User();
user.setName("java");
return user;
} public static void whenMap_thenOk() {
User user = createNewUser();
User userNull = new User();
String name = Optional.ofNullable(user).map(u -> u.getName()).orElse("vivi");
Optional<User> result = Optional.ofNullable(user).filter(u -> u.getName() != null && u.getName().contains("li"));
result.ifPresent(u -> {
String myName = result.get().getName();
//-------------
System.out.println("過濾值:" + result.get().getName());
}); //第二種:
if (result.isPresent()) {
System.out.println("過濾值2:" + result.get().getName());
}
} }