日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java中optionnull_用 option 代替 null

發(fā)布時(shí)間:2025/4/17 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java中optionnull_用 option 代替 null 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

### null 的問題

~~~

Map map = ???

String valFor2014 = map.get(“1024”); // null

if (valFor1024 == null)

abadon();

else doSomething();

~~~

* null到底代表key找不到還是說1024對(duì)應(yīng)的值就是null?

* 某年某月某日,我把為null則abandon這段代碼寫了100遍.

### option介紹

* option可以看作是一個(gè)容器,容器的size是1或0

* Size為1的時(shí)候就是一個(gè)`Some[A](x: A)`,size為0的時(shí)候就是一個(gè)`None`

### 看看scala的map

~~~

def get(key: A): Option[B]

def getOrElse[B1 >: B](key: A, default: => B1): B1 = get(key) match {

case Some(v) => v

case None => default

}

~~~

* 可以區(qū)分Map中到底又沒有這個(gè)key.

* 我見過許多java項(xiàng)目自己實(shí)現(xiàn)了`getOrElse`這個(gè)方法并放在一個(gè)叫做MapUtils的類里.

* 為什么java經(jīng)過這么多代演進(jìn),Map仍然沒有默認(rèn)包含這個(gè)方法,一直想不通.

(寫完這段突然發(fā)現(xiàn)java8開始包含getOrDefault了)

### 好像沒有太大區(qū)別?

確實(shí)能夠區(qū)分Map是無值還是值為null了.

但是if(為null) 則 abandon 要寫一百遍.

`case Some(v) => v`

`case None => default`

似乎也得寫一百遍.

不,不是這樣的

不要忘了option是個(gè)容器

[http://www.scala-lang.org/api/2.11.7/index.html#scala.Option](http://www.scala-lang.org/api/2.11.7/index.html#scala.Option)

### 試試容器里的各種方法

~~~

val a: Option[String] = Some("1024")

val b: Option[String] = None

a.map(_.toInt)

//res0: Option[Int] = Some(1024)

b.map(_.toInt)

//res1: Option[Int] = None,不會(huì)甩exception

a.filter(_ == "2048")

//res2: Option[String] = None

b.filter(_ == "2048")

//res3: Option[String] = None

a.getOrElse("2048")

//res4: String = 1024

b.getOrElse("2048")

//res5: String = 2048

a.map(_.toInt)

.map(_ + 1)

.map(_ / 5)

.map(_ / 2 == 0) //res6: Option[Boolean] = Some(false)

//如果是null,恐怕要一連check abandon四遍了

~~~

### option配合其他容器使用

~~~

val a: Seq[String] =

Seq("1", "2", "3", null, "4")

val b: Seq[Option[String]] =

Seq(Some("1"), Some("2"), Some("3"), None, Some("4"))

a.filter(_ != null).map(_.toInt)

//res0: Seq[Int] = List(1, 2, 3, 4)

//如果你忘了檢查,編譯器是看不出來的,只能在跑崩的時(shí)候拋異常

b.flatMap(_.map(_.toInt))

//res1: Seq[Int] = List(1, 2, 3, 4)

~~~

* option幫助你把錯(cuò)誤扼殺在編譯階段

* flatMap則可以在過濾空值的同時(shí)將option恢復(fù)為原始數(shù)據(jù).

scala原生容器類都對(duì)option有良好支持

~~~

Seq(1,2,3).headOption

//res0: Option[Int] = Some(1)

Seq(1,2,3).find(_ == 5)

//res1: Option[Int] = None

Seq(1,2,3).lastOption

//res2: Option[Int] = Some(3)

Vector(1,2,3).reduceLeft(_ + _)

//res3: Int = 6

Vector(1,2,3).reduceLeftOption(_ + _)

//res4: Option[Int] = Some(6)

//在vector為空的時(shí)候也能用

Seq("a", "b", "c", null, "d").map(Option(_))

//res0: Seq[Option[String]] =

// List(Some(a), Some(b), Some(c), None, Some(d))

//原始數(shù)據(jù)轉(zhuǎn)換成option也很方便

~~~

總結(jié)

以上是生活随笔為你收集整理的java中optionnull_用 option 代替 null的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。