国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發(fā)設(shè)計 > 正文

Guava:Optional使用null

2019-11-14 15:08:53
字體:
供稿:網(wǎng)友

Guava的Optional:

  大多數(shù)情況下程序員使用null是為了表示某種不存在的意思,也許應(yīng)該有一個value,但是這個value是空或者這個value找不到。比方說,在用不存在的key值從map中取  value,Map.get返回null表示沒有該map中不包含這個key。 

  若T類型數(shù)據(jù)可以為null,Optional<T>是用來以非空值替代T數(shù)據(jù)類型的一種方法。一個Optional對象可以包含一個非空的T引用(這種情況下我們稱之為“存在的”)或者不包含任何東西(這種情況下我們稱之為“空缺的”)。但Optional從來不會包含對null值的引用。

復制代碼
import com.google.common.base.Optional;public class OptionalTest {        public void testOptional() throws Exception {         Optional<Integer> possible=Optional.of(6);        if(possible.isPResent()){            System.out.println("possible isPresent:"+possible.isPresent());            System.out.println("possible value:"+possible.get());        }    } }
復制代碼

 

  由于這些原因,Guava庫設(shè)計了Optional來解決null的問題。許多Guava的工具被設(shè)計成如果有null值存在即刻報錯而不是只要上下文接受處理null值就默認使用null值繼續(xù)運行。而且,Guava提供了Optional等一些工具讓你在不得不使用null值的時候,可以更加簡便的使用null并幫助你避免直接使用null。

  Optional<T>的最常用價值在于,例如,假設(shè)一個方法返回某一個數(shù)據(jù)類型,調(diào)用這個方法的代碼來根據(jù)這個方法的返回值來做下一步的動作,若該方法可以返回一個null值表示成功,或者表示失敗,在這里看來都是意義含糊的,所以使用Optional<T>作為返回值,則后續(xù)代碼可以通過isPresent()來判斷是否返回了期望的值(原本期望返回null或者返回不為null,其意義不清晰),并且可以使用get()來獲得實際的返回值。


  Optional方法說明和使用實例:

  1.常用靜態(tài)方法:

  Optional.of(T):獲得一個Optional對象,其內(nèi)部包含了一個非null的T數(shù)據(jù)類型實例,若T=null,則立刻報錯。
  Optional.absent():獲得一個Optional對象,其內(nèi)部包含了空值
  Optional.fromNullable(T):將一個T的實例轉(zhuǎn)換為Optional對象,T的實例可以不為空,也可以為空[Optional.fromNullable(null),和Optional.absent()等價。

  使用實例如下:

復制代碼
import com.google.common.base.Optional;public class OptionalTest {        @Test    public void testOptional() throws Exception {         Optional<Integer> possible=Optional.of(6);        Optional<Integer> absentOpt=Optional.absent();        Optional<Integer> NullableOpt=Optional.fromNullable(null);        Optional<Integer> NoNullableOpt=Optional.fromNullable(10);        if(possible.isPresent()){            System.out.println("possible isPresent:"+possible.isPresent());            System.out.println("possible value:"+possible.get());        }        if(absentOpt.isPresent()){            System.out.println("absentOpt isPresent:"+absentOpt.isPresent()); ;        }        if(NullableOpt.isPresent()){            System.out.println("fromNullableOpt isPresent:"+NullableOpt.isPresent()); ;        }        if(NoNullableOpt.isPresent()){            System.out.println("NoNullableOpt isPresent:"+NoNullableOpt.isPresent()); ;        }    } }
復制代碼

  2.實例方法:

  1>. boolean isPresent():如果Optional包含的T實例不為null,則返回true;若T實例為null,返回false
  2>. T get():返回Optional包含的T實例,該T實例必須不為空;否則,對包含null的Optional實例調(diào)用get()會拋出一個IllegalStateException異常
  3>. T or(T):若Optional實例中包含了傳入的T的相同實例,返回Optional包含的該T實例,否則返回輸入的T實例作為默認值
  4>. T orNull():返回Optional實例中包含的非空T實例,如果Optional中包含的是空值,返回null,逆操作是fromNullable()
  5>. Set<T> asSet():返回一個不可修改的Set,該Set中包含Optional實例中包含的所有非空存在的T實例,且在該Set中,每個T實例都是單態(tài),如果Optional中沒有非空存在的T實例,返回的將是一個空的不可修改的Set。
  
使用實例如下:

復制代碼
import java.util.Set;import com.google.common.base.Optional;public class OptionalTest {        public void testMethodReturn() {        Optional<Long> value = method();        if(value.isPresent()==true){            System.out.println("獲得返回值: " + value.get());             }else{                            System.out.println("獲得返回值: " + value.or(-12L));            }                System.out.println("獲得返回值 orNull: " + value.orNull());                Optional<Long> valueNoNull = methodNoNull();        if(valueNoNull.isPresent()==true){            Set<Long> set=valueNoNull.asSet();            System.out.println("獲得返回值 set 的 size : " + set.size());                System.out.println("獲得返回值: " + valueNoNull.get());             }else{            System.out.println("獲得返回值: " + valueNoNull.or(-12L));            }                System.out.println("獲得返回值 orNull: " + valueNoNull.orNull());    }    private Optional<Long> method() {        return Optional.fromNullable(null);    }    private Optional<Long> methodNoNull() {        return Optional.fromNullable(15L);    }    }
復制代碼

  輸出結(jié)果:

獲得返回值: -12獲得返回值 orNull: null獲得返回值 set 的 size : 1獲得返回值: 15獲得返回值 orNull: 15

  Optional除了給null值命名所帶來的代碼可閱讀性的提高,最大的好處莫過于Optional是傻瓜式的。Optional對象的使用強迫你去積極的思考這樣一種情況,如果你想讓你的程序返回null值,這null值代表的含義是什么,因為你想要取得返回值,必然從Optional對象內(nèi)部去獲得,所以你必然會這么去思考。但是只是簡單的使用一個Null值會很輕易的讓人忘記去思索代碼所要表達的含義到底是什么,盡管FindBugs有些幫助,但是我們還是認為它并沒有盡可能的解決好幫助程序員去思索null值代表的含義這個問題。
  這種思考會在你返回某些存在的值或者不存在的值的時候顯得特別相關(guān)。和其他人一樣,你絕對很可能會忘記別人寫的方法method(a,b)可能會返回一個null值,就好像當你去寫method(a,b)的實現(xiàn)時,你也很可能忘記輸入?yún)?shù)a也可以是null。如果返回的是Optional對象,對于調(diào)用者來說,就可以忘卻怎么去度量null代表的是什么含義,因為他們始終要從optional對象中去獲得真正的返回值。


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 上林县| 高密市| 延寿县| 获嘉县| 陆丰市| 闻喜县| 汕尾市| 天津市| 玛纳斯县| 阿图什市| 囊谦县| 农安县| 宣恩县| 丹寨县| 商南县| 绥棱县| 岳阳县| 乐业县| 濮阳县| 房产| 仁布县| 邵武市| 容城县| 济宁市| 白河县| 金乡县| 海阳市| 怀远县| 白沙| 十堰市| 吴桥县| 洛阳市| 凤庆县| 洛隆县| 四川省| 绩溪县| 简阳市| 丰县| 光山县| 中江县| 志丹县|