模仿scala中的这种常规行为

时间:2014-05-30 19:54:58

标签: scala groovy

我在groovy中有这个功能

def tokens = ['Will', 'is', 'coding', 'in', 'groovy']
String sentence = tokens.inject({sent, word -> sent + ' ' + word})
println sentence

使用此输出:

  

“Will会在groovy编码”

Inject是groovy,因为折叠是scala。如果未在注入中设置累加器值,则默认为列表中的第一项。我怎么能在Scala中做到这一点?

val tokens = List("Will", "is", "coding", "in", "Scala")
val sentence = tokens.foldLeft(""){(sent, word) => sent + " " + word}
println(sentence)

产生此输出(句子前面的空格):

  

“将在Scala中编码”

我知道它为什么会发生,但我不确定如何在以类似方式折叠的同时消除它。无论如何要在Scala中做到这一点?

2 个答案:

答案 0 :(得分:3)

inject的正确等效值是reduce(实际上我只是注意到你将初始值传递给inject,所以这并不完全准确 - 我是&#39}。没有足够的Groovy人来说明为什么Groovy版本在不知道sent的价值的情况下是如何工作的那样:

scala> val sentence = tokens.reduce { (sent, word) => sent + " " + word }
sentence: String = Will is coding in Scala

请注意,如果tokens为空,则会爆炸。如果有任何机会,reduceOption会更安全 - 如果收集为空,则会返回None,否则会返回Some[Whatever]

答案 1 :(得分:0)

mkString完全适用于此用例。

scala> val tokens = List("Will", "is", "coding", "in", "Scala") 
tokens: List[String] = List("Will", "is", "coding", "in", "Scala")
scala> tokens.mkString(" ") 
res1: String = "Will is coding in Scala"