2013-02-10 5 views
-3

Есть ли лучший способ переписать функцию 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()) 
+5

На самом деле, объясняя, что вы пытаетесь достичь, может быть оказана какая-то помощь ... –

+4

может быть, это имя 'bar'? –

ответ

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")) 

Я отделил его на две основные части, одна из которых в общей реализации базовой, а другой экземпляр его использования. Метод преобразования был перенесен в стиль использования стилей с использованием свойства StringConverter, так как оригинальный метод конвертации сам по себе не работает.

За что основное изменение только конвертировать все в список в для понимания:

  • Во-первых, мы сводим вариант от .get вызова к списку.
  • Затем буфер превращается в список.
  • Результат преобразования превращается в список.
Смежные вопросы