Вот мое предложение (если у меня есть логику правильно):
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"))
Я отделил его на две основные части, одна из которых в общей реализации базовой, а другой экземпляр его использования. Метод преобразования был перенесен в стиль использования стилей с использованием свойства StringConverter, так как оригинальный метод конвертации сам по себе не работает.
За что основное изменение только конвертировать все в список в для понимания:
- Во-первых, мы сводим вариант от .get вызова к списку.
- Затем буфер превращается в список.
- Результат преобразования превращается в список.
На самом деле, объясняя, что вы пытаетесь достичь, может быть оказана какая-то помощь ... –
может быть, это имя 'bar'? –