8

私はこれらのリンクを見てきました

http://blog.danielwellman.com/2008/03/using-scalas-op.html

http://blog.tmorris.net/scalaoption-cheat-sheet/

[String, Integer] のマップがあり、 map.get("X") を実行するとオプションが表示されます。以下をお願いします。

val Int count = map.get(key); 
// If the key is there I would like value if it is not I want 0

これを1行で達成するにはどうすればよいですか? これを数回行う必要があります。これを行うために毎回関数を書くのは少し非効率に見えます。私が見逃しているインテリジェントな1行の癖があると確信していますが、1行で値を整数に変換するのが本当に好きです:)

4

3 に答える 3

18

getOrElse メソッドを使用するだけです。

val count: Int = map.getOrElse(key,0);

また、Scala では、名前の前ではなく、名前の後に型を記述することに注意してください。

于 2012-04-17T08:56:05.713 に答える
6

@om-nom-nom (古典的なスクリーン ネーム) は正しい答えを持っていますが、さらに別の方法を提供するために™

val count = map.get(key) fold(0)(num => num)

事情通のユーザーが「オプションに折り畳みがない!」とバッシングする前に、 Scala 2.10でオプションに折り畳みが追加されました。

もちろん、現在のケースでは getOrElse の方が優れていますが、一部の Some/None シナリオでは、そのような折り畳みを使用して 1 ライナーにするのが興味深い場合があります (最新の 2.10 スナップショットに対してテストした @Debiliski の補足を編集):

val count = map.get(k).fold(0)(dao.userlog.count(_))

2.9.2以下では、すでにできると思います:

val count = map get(k) map ( dao.userlog.count(_) ) getOrElse(0)

つまり、Scala では、同じことを行う方法が複数あることがよくあります。リンクされたスレッドでは、OP は Option fold を実現するための 10 以上の代替手段を示しています ;-)

于 2012-04-17T10:17:18.760 に答える
3

さらに別の方法。

import scalaz._, Scalaz._

scala> val m = Map(9 -> 33)
m: scala.collection.immutable.Map[Int,Int] = Map(9 -> 33)

scala> m.get(9).orZero
res3: Int = 33

scala> m.get(8).orZero
res4: Int = 0
于 2012-04-17T16:35:42.770 に答える