2015-05-07 2 views
0

Я пытаюсь понять, как andThen работает в Scala.Тип вывода in andThen() в Scala

Вот код:

def collectNames(fromList: List[Map[String,String]]) = { 
     fromList.foldLeft(new StringBuffer)((x,y) => { 
      x.append(y("Name")).append(",") 
     }).toString 
    } 

    def getOriginalList = List(Map("Name" -> "NS","Age" -> "50"),Map ("Name" -> "SS", "Age" -> "45")) 


    getOriginalList andThen collectNames 

компилятор считает, что это неприятно. Кажется, что collectNames присваивается Map[String,String], а не List[Map[String,String]].

Что мне нужно, чтобы написать этот маленький фрагмент «проточного» кода правильно?

ответ

1

Проблема заключается в том, что getOriginalList _ не является Function0 (т.е. () => R) и не имеет compose или andThen.

Таким образом, это не будет компилироваться: getOriginalList _ andThen collectNames _

Теперь, если getOriginalList можно рассматривать как частично прикладной function1, он будет работать:

def getOriginalList(a: Any) = List(Map("Name" -> "NS","Age" -> "50")) 
val composed = getOriginalList _ andThen collectNames _ 

Но в вашем случае, состав мудрый, вы, вероятно, следует рассматривать getOriginalList как val и использовать его в качестве аргумента функции:

def collectNames(fromList: List[Map[String,String]]) = { 
    fromList.foldLeft(new StringBuffer)((x,y) => { 
     x.append(y("Name")).append(",") 
    }).toString 
} 

def getOriginalList = List(Map("Name" -> "NS","Age" -> "50"),Map ("Name" -> "SS", "Age" -> "45")) 

val comp = collectNames _ andThen ((s: String) => s.length()) 
val n = comp(getOriginalList) // 6 = ("NS,SS,".length()) 
+0

большое спасибо за объяснение. _getOriginalList_ в моем фрагменте кода был просто примером, быстро написанным (лень)! В моем фактическом коде это действительно функция с некоторой логикой. Однако я понимаю, почему вы предлагаете, чтобы он передавался как аргумент функции. – Nirmalya

Смежные вопросы