Java 8引入了一個(gè)java.util.Optional類來優(yōu)雅地處理NullPointerException。
Optional是可以包含或不包含非空值的非空值的包裝器。
可能返回null的方法應(yīng)返回Optional,而不是null。
如果其包含非空值,則來自可選<T>的isPresent()返回true,否則返回false。
如果get()方法包含非空值,則返回非空值,否則拋出NoSuchElementException。
當(dāng)一個(gè)方法返回一個(gè)可選,你必須檢查它是否包含一個(gè)非空值,然后再詢問它的值。
如果在確保它包含非空值之前調(diào)用了get()方法,則會(huì)拋出NoSuchElementException,而不是拋出NullPointerException。
Optional <T>類提供了三個(gè)靜態(tài)工廠方法來創(chuàng)建Optional對(duì)象。
以下代碼顯示如何創(chuàng)建Optional對(duì)象:
import java.util.Optional; public class Main { public static void main(String[] args) { Optional<String> empty = Optional.empty(); System.out.println(empty); Optional<String> str = Optional.of("m.hgci.cn"); System.out.println(str); String nullableString = ""; Optional<String> str2 = Optional.of(nullableString); System.out.println(str2); } }
上面的代碼生成以下結(jié)果。
如果包含非空值,以下代碼將在可選中打印值:
import java.util.Optional; public class Main { public static void main(String[] args) { Optional<String> str = Optional.of("m.hgci.cn"); if (str.isPresent()) { String value = str.get(); System.out.println("Optional contains " + value); } else { System.out.println("Optional is empty."); } } }
上面的代碼生成以下結(jié)果。
if Present(Consumer<? super T> action)
方法對(duì)Optional中包含的值執(zhí)行操作。
如果Optional是空的,這個(gè)方法不做任何事情。
以下代碼打印出來自O(shè)ptional的內(nèi)容。
import java.util.Optional; public class Main { public static void main(String[] args) { Optional<String> str = Optional.of("m.hgci.cn"); str.ifPresent(value -> System.out.println("Optional contains " + value)); } }
上面的代碼生成以下結(jié)果。
如果Optional是空的,代碼將不會(huì)打印任何東西。
以下是獲取可選值的四個(gè)方法:
OptionalInt,OptionalLong和OptionalDouble處理可選的基本值。
基本可選類的getters當(dāng)它們?yōu)榭諘r(shí)也會(huì)拋出NoSuchElementException。
以下代碼顯示了如何使用OptionalInt類:
import java.util.OptionalInt; public class Main { public static void main(String[] args) { OptionalInt number = OptionalInt.of(2); if (number.isPresent()) { int value = number.getAsInt(); System.out.println("Number is " + value); } else { System.out.println("Number is absent."); } } }
上面的代碼生成以下結(jié)果。
一些流操作返回可選。 例如,所有流類中的max()方法返回一個(gè)可選對(duì)象。 當(dāng)對(duì)空流使用max()方法時(shí),返回值是一個(gè)沒有內(nèi)容的可選對(duì)象。
通過使用可選類,我們可以優(yōu)雅地處理這些方法的返回值。
以下代碼顯示了如何使用返回的max()形式的Optional對(duì)象。
import java.util.OptionalInt; import java.util.stream.IntStream; public class Main { public static void main(String[] args) { OptionalInt maxOdd = IntStream.of(10, 20, 30).filter(n -> n % 2 == 1).max(); if (maxOdd.isPresent()) { int value = maxOdd.getAsInt(); System.out.println("Maximum odd integer is " + value); } else { System.out.println("Stream is empty."); } } }
上面的代碼生成以下結(jié)果。
更多建議: