有没有更好的方法来重写foo[T]
函数?
implicit def stringConverter(s: String) = new {
def convert[T](): Option[T] = { //converts s: String to Option[T] }
}
def foo[T](m: Map[String,Buffer[String]], k: String): List[T] =
m.get(k).flatMap { x => x.map(_.convert[T]).filterNot(_ == None).map(_.get).toList }.getOrElse(List())
答案 0 :(得分:2)
这是我的建议(如果我的逻辑是正确的):
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"))
我把它分成两个主要部分,一个是基本的通用实现,另一个是使用它的实例。 convert方法已经被转换为使用StringConverter特性的类型使用方式,因为原始的转换方法本身并不起作用。
除此之外,主要的变化只是将所有内容转换为for comprehension中的列表: