通常、返してから、「見つからない」ことを意味するセンチネル値を生成するためOption
に使用することはお勧めできません。値が見つからないことを示すために設計されていますgetOrElse
。Option
Option
map
や などの関数型プログラミング構成要素と組み合わせて使用すると、その力が本当に発揮されforeach
ます。これは、複数のオプションを扱う場合に最も強力です。たとえば、ファイルが存在し、ディレクトリではなくファイルである場合にのみ、文字列を取得してファイルを返すメソッドを作成するとします。
import java.io._;
def niceFile1(s: String): File = {
val f = new File(s);
if (f.exists && !f.isDirectory) f else null
}
def niceFile2(s: String): Option[File] = {
val f = new File(s);
if (f.exists && !f.isDirectory) Some(f) else None
}
これまでのところ、使用するnull
方が簡単です。少なくとも、これが原因null
で NPE が発生する可能性があることを忘れるまでは。ともあれ、さっそく使ってみましょう。
def niceFopen1(s: String) = {
val f = niceFile1(s);
if (f!=null) new FileInputStream(f) else null;
}
def niceFopen2(s: String) = niceFile2(s).map(f => new FileInputStream(f))
何が起こったのか見てください!前者の場合、手動でロジック テストを行い、一時変数を作成する必要がありました。うーん!2 番目のケースでmap
は、すべての面倒な作業を行いました。None は None にマップされ、Some(file)
にマップされましたSome(fileinputstream)
。簡単!
しかし、それはさらに良くなります。たぶん、たくさんのファイルのサイズを見つけたいと思うでしょう:
def totalSize2(ss: Seq[String]) = {
(0L /: ss.flatMap(niceFile2)){(sum,f) => sum+f.length}
}
待ってください、ここで何が起こっているのNone
ですか? 注意して何とかしないといけませんか?ここで、flatMap
すべての回答を 1 つのリストに結合します。 None
は長さ 0 の回答であるため、無視されます。 Some(f)
答えは 1 つなのでf
、リストに入れます。次に、フォールドを使用してすべての長さを合計します。これで、リスト内のすべての要素が有効になります。かなりいい!