2013-02-10 154 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特徵的類型類型的使用風格。

除此之外,主要的變化就是一切轉換到一個列表中的理解:

  • 首先我們把從不用彷徨調用列表中的選項。
  • 然後緩衝區變成一個列表。
  • 轉換結果轉換爲列表。
相關問題