2017-12-23 20 views
-1

のオプションのシーケンスは、ここではいくつかのデータです:スカラ:引数

val data = List(1,1,2,2,3) 

私は次のことをサポートしている機能filteredSumを書きたいと思います:

/*1*/ filteredSum(data) // Outputs 0 
/*2*/ filteredSum(data, 1) // Outputs 1 + 1 = 2 
/*3*/ filteredSum(data, 1, 3) // Outputs 1 + 1 + 3 = 5 
/*4*/ filteredSum(data, None) // Outputs 1 + 1 + 2 + 2 + 3 = 9 

カップル近いミスがあります。

def filteredSum(data: Seq[Int], filterValues: Int*): Int = { 
    data.intersect(filterValues).sum 
} 

とオプションあなたの第四を与える:

def filteredSum(data: Seq[Int], filterValues: Option[Seq[Int]]) : Int = { 
    if(filterValues.nonempty) data.intersect(filterValues.get).sum 
    else data.sum 
} 

しかし、この実装で最初の3つの呼び出しがたくさんclunkier見て:filteredSum(data, Some(Seq(1)))、例えば。例えば*表記は最初の3つの呼び出しをサポートしています

他のアイデアはありますか? (もちろん、私の実際のユースケースは、はるかに複雑ちょうど一緒にいくつかの数字を追加するよりも、私はあまりにも密接にintersectまたはsum機能に関連付けられている答えを探していないよ。)

答えて

1

は2つの機能確認します:

def filteredSum(data: Seq[Int], filterValues: Int*): Int = 
    data.filter(filterValues.toSet).sum 


def filteredSum(data: Seq[Int], all: Boolean) : Int = 
    if(all) data.sum else 0 
+0

これは馬鹿に聞こえますが、これを行うことができないことを忘れていました。あまりにも多くのPython ... –