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