私はPartialFunction[String,String]
とMap[String,String]
を持っています。 マップ値に部分関数を適用し、それが適用されたエントリを収集したいと思います。 はすなわち与えられた:タプル構造に部分関数を適用し、タプル構造を維持する
val m = Map("a"->"1", "b"->"2")
val pf : PartialFunction[String,String] = {
case "1" => "11"
}
私は何とかpf
で_._2
を組み合わせて、これを実行できるようにしたいと思います:
val composedPf : PartialFunction[(String,String),(String,String)] = /*someMagicalOperator(_._2,pf)*/
val collected : Map[String,String] = m.collect(composedPf)
// collected should be Map("a"->"11")
これまでのところ、私が得た最高のは、このでした:
val composedPf = new PartialFunction[(String,String),(String,String)]{
override def isDefinedAt(x: (String, String)): Boolean = pf.isDefinedAt(x._2)
override def apply(v1: (String, String)): (String,String) = v1._1 -> pf(v1._2)
}
は良い方法ですか?
m.filter(e => pf.isDefinedAt(e._2)).mapValues(pf)
これは、私がやったことをより良くする方法のように見えます。私はもっと一般的なものを探していました。それについて考えると、レンズはそのトリックをするかもしれません。 –
私はまた、成功していない何かを見つけようとしました。 '(String、String)=>(String、String)'と 'String => String'のような全く異なる型の関数を作成する必要があるか、私の例がしていることです。いずれにせよ、私はそのような結合機能のシグネチャさえも恐ろしいものではない。答えは – Mifeet
です。私はレンズでこれを達成するためのすてきな方法を見つけたらここで更新します。 –