2012-02-15 22 views
1

メソッドの引数として関数を使用して頭を抱えようとしています。簡単な例についてのは、使用してみましょう:Scala - 関数を引数として持つメソッド

case class IntegrationOption(id: Option[Long], name: String, iconUrl: String) 

val availableOptions = List(
    IntegrationOption(Some(1), "blah1", "dsaadsf.png"), 
    IntegrationOption(Some(2), "blah2", "dsaadsf.png") 
) 

私はこのような何かに機能して渡したい:

ARGがあるかもしれない
def getIntegrationOption(ARG) = { 
    availableOptions.find(ARG) 
} 

x => x.id == Option(id) 

または

x => x.name == "blah1" 

アイデア?思考?

答えて

5

これは動作するはずです:

次のように
def getIntegrationOption(predicate: IntegrationOption => Boolean) = 
    availableOptions.find(predicate) 

今、あなたはそれを使用することができます。

getIntegrationOption(_.iconUrl == "dsaadsf.png") 

IntegrationOptionが既にケースクラスであるため、あなたには、いくつかの手の込んだは、パターンマッチングと部分的に適用された機能で検索を行うことができます注意:

availableOptions.collectFirst{ 
    case IntegrationOption(Some(1), name, _) => name 
} 

か:

availableOptions.collectFirst{ 
    case [email protected](_, "blah2", _) => io 
} 
5

あなたがしなければならないのは、あなたが他の関数と同様のパラメータを使用するか、findのような高階関数に渡すことができ、関数のパラメータを宣言している:

def getIntegrationOption(f: IntegrationOption => Boolean) = { 
    availableOptions.find(f) 
} 
getIntegrationOptions(x => x.name == "blah1") 
//or you could do just 
getIntegrationOptions(_.name == "blah1") 
+0

、これはあまりにも偉大な答えです。 2つの正解を設定できますか? –

関連する問題