これが私の提案です(あなたのロジックが正しい場合):
import scala.collection.mutable.Buffer
// Implementation.
trait StringConverter[T] {
def convert(string: String): Option[T]
}
def foo[T](m: Map[String,Buffer[String]], k: String)
(implicit converter: StringConverter[T]): List[T] =
for {
lookupFromMap <- m.get(k).toList
valueFromList <- lookupFromMap.toList
convertedValueFromList <- converter.convert(valueFromList).toList
} yield convertedValueFromList
// Instance.
implicit val intConverter: StringConverter[Int] = new StringConverter[Int] {
def convert(string: String): Option[Int] = Some(string.length)
}
val map = Map("one" -> Buffer("1", "11"), "two" -> Buffer("2", "222222222"))
println(foo[Int](map, "one"))
println(foo[Int](map, "two"))
println(foo[Int](map, "three"))
私はこれを 2 つの主要な部分に分けました。1 つは基本的な一般的な実装であり、もう 1 つは使用されるインスタンスです。convert メソッドは、StringConverter トレイトを使用する typeclass スタイルの使用法に移動されました。元の convert メソッドはそれ自体では実際には機能しないためです。
それ以上の主な変更点は、すべてを for 内包表記のリストに変換することです。
- まず、Option を .get 呼び出しから List に変換します。
- 次に、バッファがリストに変わります。
- 変換の結果はリストに変換されます。