首頁 > Java > java教程 > 主體

分享Java8中新引入的類別Optional實例程式碼

零下一度
發布: 2017-05-24 11:41:38
原創
2083 人瀏覽過

Optional是Java8新引入的類別
這是一個可以為null的容器對象。如果值存在則isPresent()方法會傳回true,呼叫get()方法會傳回該物件。
java.lang.NullPointerException,只要敢自稱Java程式設計師,那對這個異常就再熟悉不過了。為了防止拋出這個異常,我們常常會寫出這樣的程式碼:

Person person = people.find("John Smith");
if (person != null) {
 person.doSomething();
}
登入後複製

遺憾的是,在絕大多數Java程式碼裡,我們常常忘記了判斷空引用,所以,NullPointerException便也隨之而來了。
“Null Sucks.”,這就是Doug Lea對空的評價。身為一個Java程式設計師,如果你還不知道Doug Lea是誰,那趕緊補課,沒有他的貢獻,我們還只能用Java最原始的裝備處理多執行緒。
"I call it my billion-dollar mistake.",有資格說這話是空引用的發明者,Sir C. A. R. Hoare。你可以不知道Doug Lea,但你一定要知道這位老人家,否則,你便沒資格使用快速排序。
在Java世界裡,解決空引用問題常見的一種方法是,使用Null Object模式。這樣的話,在「沒有什麼」的情況下,就回傳Null Object,客戶端程式碼就不用判斷是否為空了。但是,這種做法也有一些問題。首先,我們肯定要為Null Object編寫程式碼,而且,如果我們想大規模地應用這個模式,我們要為幾乎每個類別編寫Null Object。

幸好,我們還有另一個選擇:Optional。 Optional是對可以為空的物件進行的封裝,它實現起來並不復雜。在某些語言裡,例如Scala,Optional實作成了語言的一部分。而對於Java程式設計師而言,Guava為我們提供了Optional的支援。閒言少敘,先來如何使用Optional,完成前面的那段程式碼。

Optional person = people.find("John Smith");
if (person.isPresent()) {
 person.get().doSomething();
}
登入後複製

這裡如果isPresent()回傳false,表示這是個空對象,否則,我們就可以把其中的內容取出來做自己想做的操作了。
如果你期待的是程式碼量的減少,恐怕這裡要讓你失望了。單從程式碼量上來說,Optional甚至比原來的程式碼還多。但好處在於,你絕對不會忘記判空,因為這裡我們得到的不是Person類的對象,而是Optional。
以下是個人練習的程式碼

public class OptionalTest {
	/**
	 * of后面接给optional设置的值 但是不能为空 如果为空会报空指针异常
	 * @Title: ofTest
	 * @Description: TODO
	 * @param: 
	 * @return: void
	 * @throws
	 */
//	@Test
	public void ofTest()
	{
		Optional<String> optional = Optional.of("123");
		System.out.println(optional.get());
		try
		{
			optional = Optional.of(null);
			System.out.println(optional.get());  //get方法是获取optional的值 类型取决于声明的时候
		}catch(NullPointerException e)
		{
			System.out.println("空指针异常");
		}
	}
	/**
	 * ofNullable 和of类似 但是ofNullable可以设置null值  如果是Null值得话取值会报NoSuchElementException 异常
	 * @Title: ofNullableTest
	 * @Description: TODO
	 * @param: 
	 * @return: void
	 * @throws
	 */
//	@Test
	public void ofNullableTest()
	{
		Optional<String> optional = Optional.ofNullable("123");
		System.out.println(optional.get());
		try
		{
			optional = Optional.ofNullable(null);
			System.out.println(optional.get());
		}catch(NoSuchElementException e)
		{
			System.out.println("NoSuchElementException 异常");
		}
	}
	
	/**
	 * ifPresent用来判断optional中有没有值存在 如果有则为真
	 * @Title: isPresentTest
	 * @Description: TODO
	 * @param: 
	 * @return: void
	 * @throws
	 */
//	@Test
	public void isPresentTest()
	{
		Optional<String> optional =  Optional.ofNullable(null);
		if(optional.isPresent())
		{
			System.out.println(optional.get());
		}
		else
		{
			System.out.println("值为空");
		}
	}
	/**
	 * ifPresent和isPresent类似 只不过它支持λ表达式
	 * @Title: ifPresentTest
	 * @Description: TODO
	 * @param: 
	 * @return: void
	 * @throws
	 */
//	@Test
	public void ifPresentTest()
	{
		Optional<String> optional =  Optional.ofNullable("123");
		optional.ifPresent(var ->{
			System.out.println(var);
		});
	}
	
	/**
	 * orElse方法,如果值为空的话会用参数中的值去替换 即设置默认值
	 * @Title: orElseTest
	 * @Description: TODO
	 * @param: 
	 * @return: void
	 * @throws
	 */
//	@Test
	public void orElseTest()
	{
		Optional<String> optional =  Optional.ofNullable("123");
		System.out.println(optional.orElse("有没有"));
		optional = Optional.ofNullable(null);
		System.out.println(optional.orElse("有没有"));
	}
	/**
	 * orElseGet方法 和orElse类似 不过此方法接受Supplier接口的实现用来生成默认值
	 * @Title: orElseGetTest
	 * @Description: TODO
	 * @param: 
	 * @return: void
	 * @throws
	 */
//	@Test
	public void orElseGetTest()
	{
		Optional<String> optional =  Optional.ofNullable("123");
		System.out.println(optional.orElseGet(()->"123456"));
		optional = Optional.ofNullable(null);
		System.out.println(optional.orElseGet(()->"123456"));
	}
	/**
	 * map方法  如果有值则会对值进行mapping中的处理 处理结果存在则创建并返回Optional类型的结果 否则返回空
	 * @Title: mapTest
	 * @Description: TODO
	 * @param: 
	 * @return: void
	 * @throws
	 */
//	@Test
	public void mapTest()
	{
		Optional<String> optional =  Optional.ofNullable("abc");
		System.out.println(optional.map(var->var.toUpperCase()).get());
	}
	/**
	 * flatMap和map类似 只不过mapping中必须返回Option类型的数据
	 * @Title: flatMapTest
	 * @Description: TODO
	 * @param: 
	 * @return: void
	 * @throws
	 */
//	@Test
	public void flatMapTest()
	{
		Optional<String> optional =  Optional.ofNullable("abc");
		System.out.println(optional.flatMap(var->Optional.of(var.toUpperCase())).get());
	}
	/**
	 * filter对optional进行过滤,mapping中为过滤的条件  如果不满足条件 返回一个为空的Optional
	 * @Title: filterTest
	 * @Description: TODO
	 * @param: 
	 * @return: void
	 * @throws
	 */
	@Test
	public void filterTest()
	{
		try
		{
			Optional<String> optional = Optional.ofNullable("一二三四五六七八");
			System.out.println(optional.filter(var ->var.length()>6).get());
			System.out.println(optional.filter(var ->var.length()<6).get());
		}catch(NoSuchElementException e)
		{
			System.out.println("optional的值为空");
		}
	}
登入後複製

【相關推薦】

#1. Java 8新增的API--Optional 的使用實例

2. 解析Java 8 Optional類別實例教學

以上是分享Java8中新引入的類別Optional實例程式碼的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!