我在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中做到这一点?
答案 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"