2013-02-10 112 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

其实解释你想达到什么可能会有一些帮助... – 2013-02-10 10:23:27

+4

也许将其命名为'bar'? – 2013-02-10 10:29:10

回答

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方法本身并不起作用,所以convert方法已经被转换成带有StringConverter特征的类型类型的使用风格。

除此之外,主要的变化就是一切转换到一个列表中的理解:

  • 首先我们把从不用彷徨调用列表中的选项。
  • 然后缓冲区变成一个列表。
  • 转换结果转换为列表。
相关问题