这是我的建议(如果我的逻辑正确的话):
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 特征的类型类使用风格中,因为原始的 convert 方法本身并不能真正起作用。
除此之外,主要变化只是将所有内容转换为 for 理解中的列表:
- 首先,我们将 Option 从 .get 调用转换为 List。
- 然后将Buffer变成一个List。
- 转换的结果变成了一个List。