scala for/yield循环与java for循环(初始标题“递归值XXX需要类型”,尽管类型已经说明)
我是斯卡拉的新手。温柔点。我想在scala中使用for/yield做一些非常基本的事情。这段代码在Java中的等价物是什么:scala for/yield循环与java for循环(初始标题“递归值XXX需要类型”,尽管类型已经说明),scala,for-loop,types,iteration,yield,Scala,For Loop,Types,Iteration,Yield,我是斯卡拉的新手。温柔点。我想在scala中使用for/yield做一些非常基本的事情。这段代码在Java中的等价物是什么: int somme = 0 for (int i = 1; i < 11 ; i++ ) somme = somme + i int-somme=0 对于(int i=1;i,它不携带任何有意义的信息,只浪费内存。@ AndreyTyukin,即使它是Python,使用收益率仍然会产生一个序列。@ Sepp2k要么我不明白你的意思,要么:不,它不会。考虑
int somme = 0
for (int i = 1; i < 11 ; i++ )
somme = somme + i
int-somme=0
对于(int i=1;i<11;i++)
somme=somme+i
在斯卡拉
var somme: Int = 0
for {
i <- 1 to 10
somme = somme + i
} yield somme
var-somme:Int=0
为了{
在scala中使用var不是一个好主意,因为它是可变的
您可以轻松做到这一点:
val somme = (1 to 10).sum
但如果您真的想使用var,并且为了理解这一点:
var somme: Int = 0
for {
i <- 1 to 10
} yield {
somme = somme + i
}
println(somme)
var-somme:Int=0
为了{
i您不需要使用收益率。等价物可能如下:
var somme: Int = 0
for(i <- 1 to 10 ){
somme = somme + i
}
(1 to 10) reduce {_ + _}
//=> res: Int = 55
var-somme:Int=0
Scala中的for(ifor
是foreach
、map
、flatMap
和with filter
的语法糖。它实际上根本不是一个循环
for
withoutyield
是foreach
的语法糖,因此大致相当于(var-el:collection)
循环的Java“增强的”
Scala中Javafor
循环的等价物实际上是while
循环,因为这是Scala唯一的循环类型:
var somme = 0
var i = 1
while (i < 11) {
somme += i
i += 1
}
这是语法糖
var somme = 0
(1 to 10) foreach { i ⇒ somme += i }
这大致相当于以下Java代码:
var somme = 0;
for (var i : java.util.stream.IntStream.range(1, 11)) somme += i;
但是,请注意,这不是在Scala中编写代码的方式(实际上也不是在现代Java中)
var somme: Int = 0
for(i <- 1 to 10 ){
somme = somme + i
}
(1 to 10) reduce {_ + _}
//=> res: Int = 55
在这种情况下:
(1 to 10).sum
//=> res: Int = 55
这相当于您在现代Java中的编写方式:
java.util.stream.IntStream.range(1, 11).reduce((a, b) -> a + b)
或
你到底想做什么?在scala中使用for/yield将int的和从1到10。我想使用for/yield。你希望结果是一个序列还是一个整数?你的Java代码只生成一个整数,但是你的scala版本,如果它真的像你希望的那样工作,会生成一个序列。它不是(1到11)
.I have change.Good.但是第二个代码片段中的yield{()}
仍然是奇怪和误导的。而且,第二个解决方案使用了O(n)空间。O(n)时间已经够糟糕了(因为结果可以通过O(1)中的显式公式计算),但是O(n)空间实在是太不必要了……感谢你对收益率@Andreytytukini的以下解释。我会将“你不需要”改为“你不能”,因为这里没有办法对收益率有意义地使用。哦,好吧。我是不是错过了“收益率”的要点?“收益率”就像“回报率”。为什么我不能在循环中计算somme之后返回它呢?@user3600237 Afor/yield
用于从1到10的序列会产生一个长度为10的序列。但是你想要一个和,它是一个单一的数字。单一的数字不是一个序列。因此,你不能使用for yield
来实现这一点。它不是python,yield
在n中o方式“likereturn
”。如果在上述for
-循环中添加一个yield
,它将生成一个包含10个元素的无用数据结构()
,类似于列表((),(),(),(),(),(),,(),,(),(),(),())< /代码>,它不携带任何有意义的信息,只浪费内存。@ AndreyTyukin,即使它是Python,使用<代码>收益率<代码>仍然会产生一个序列。@ Sepp2k要么我不明白你的意思,要么:不,它不会。考虑可中断的生成器函数<代码> DEF():对于i的范围(1, 11):yield i
。现在调用sum(foo())
。范围(1,11)
本质上只是一个包含两个数字的元组,它占用常量空间。整个挂起的foo
协同路由也占用常量空间。它在任何时候都不会创建任何占用O(n)空间的数据结构。但是对于(i)您的Java流示例在增强的
示例中有一个额外的近距离paren.Cut&Paste错误。谢谢!
java.util.stream.IntStream.range(1, 11).sum()