本套JAVA8教程由于是有英文翻譯過來的,如果有翻譯不對的地方還請多多包涵。
本節(jié)課先簡單的介紹下Java8有哪些新特性,對于Java6/7版本做出哪些更改.那廢話不多說,趕緊開始今天的課程吧.
引子
Java 8在java.util包中引入了一個新類Optional诚纸。 它用于表示存在或不存在的值。 這個新構造的主要優(yōu)點是沒有太多的空檢查和NullPointerException谢揪。 它避免了任何運行時NullPointerExceptions,并支持我們開發(fā)干凈整潔的Java API或應用程序捐凭。 與集合和數(shù)組一樣,它也是一個容納最多一個值的容器凳鬓。 讓我們用一些有用的例子來探索這個新的構造茁肠。
那么在java8 中:
- 需要空檢查
- 在運行時不再有NullPointerException
- 我們可以開發(fā)干凈整潔的API
Optional 基礎例子
public static void main(String[] args) {
Optional<String> gender = Optional.of("MALE");
String answer1 = "Yes";
String answer2 = null;
System.out.println("Non-Empty Optional:" + gender);
System.out.println("Non-Empty Optional: Gender value : " + gender.get());
System.out.println("Empty Optional: " + Optional.empty());
System.out.println("ofNullable on Non-Empty Optional: " + Optional.ofNullable(answer1));
System.out.println("ofNullable on Empty Optional: " + Optional.ofNullable(answer2));
// java.lang.NullPointerException
System.out.println("ofNullable on Non-Empty Optional: " + Optional.of(answer2));
}
輸出內容
Non-Empty Optional:Optional[MALE]
Non-Empty Optional: Gender value : MALE
Empty Optional: Optional.empty
ofNullable on Non-Empty Optional: Optional[Yes]
ofNullable on Empty Optional: Optional.empty
Exception in thread "main" java.lang.NullPointerException
at java.util.Objects.requireNonNull(Objects.java:203)
at java.util.Optional.<init>(Optional.java:96)
at java.util.Optional.of(Optional.java:108)
at Java82.main(Java82.java:30)
Optional的map和flatMap用法
public static void main(String[] args) {
Optional<String> nonEmptyGender = Optional.of("male");
Optional<String> emptyGender = Optional.empty();
System.out.println("不為空 Optional:: " + nonEmptyGender.map(String::toUpperCase));
System.out.println("空 Optional :: " + emptyGender.map(String::toUpperCase));
Optional<Optional<String>> nonEmptyOtionalGender = Optional.of(Optional.of("male"));
System.out.println("Optional value :: " + nonEmptyOtionalGender);
System.out.println("Optional.map :: " + nonEmptyOtionalGender.map(gender -> gender.map(String::toUpperCase)));
System.out.println("Optional.flatMap :: " + nonEmptyOtionalGender.flatMap(gender -> gender.map(String::toUpperCase)));
}
輸出
不為空 Optional:: Optional[MALE]
空 Optional :: Optional.empty
Optional value :: Optional[Optional[male]]
Optional.map :: Optional[Optional[MALE]]
Optional.flatMap :: Optional[MALE]
Optional filter用法
public static void main(String[] args) {
Optional<String> gender = Optional.of("MALE");
Optional<String> emptyGender = Optional.empty();
//Filter on Optional
System.out.println(gender.filter(g -> g.equals("male"))); //Optional.empty
System.out.println(gender.filter(g -> g.equalsIgnoreCase("MALE"))); //Optional[MALE]
System.out.println(emptyGender.filter(g -> g.equalsIgnoreCase("MALE"))); //Optional.empty
}
輸出
Optional.empty
Optional[MALE]
Optional.empty
Optional 中 isPresent 和 ifPresent的用法
如果給定的Optional對象非空,則Optional.isPresent()返回true缩举。否則返回false
public static void main(String[] args) {
Optional<String> gender = Optional.of("MALE");
Optional<String> emptyGender = Optional.empty();
if (gender.isPresent()) {
System.out.println("Value available.");
} else {
System.out.println("Value not available.");
}
gender.ifPresent(g -> System.out.println("不會報空指針"));
//condition failed, no output print
emptyGender.ifPresent(g -> System.out.println("不會報空指針"));
}
輸出
Value available.
不會報空指針
空
Optional orElse 方法
解釋:如果在Optional Container中存在垦梆,則返回該值。否則返回給定的默認值仅孩。
public static void main(String[] args) {
Optional<String> gender = Optional.of("梁思前");
Optional<String> emptyGender = Optional.empty();
System.out.println(gender.orElse("<N/A>")); //梁思前
System.out.println(emptyGender.orElse("<N/A>")); //<N/A>
System.out.println(gender.orElseGet(() -> "<N/A>")); //梁思前
System.out.println(emptyGender.orElseGet(() -> "<N/A>")); //<N/A>
}
輸出
梁思前
<N/A>
梁思前
<N/A>
其實看到這里大家應該看懂了吧, 其實就是一個if else的邏輯, 這樣看起來更清爽,而且會提示你讓你強制判斷空指針的問題,從而告別空指針.
歡迎留言討論