有没有办法检查scala中foreach循环中的条件。例如,我想通过一个整数数组,对正数进行任意数学运算。
val arr = Array(-1,2,3,0,-7,4) //The array
//What I want to do but doesn't work
arr.foreach{if(/*This condition is true*/)
{/*Do some math and print the answer*/}}
//Expected answer for division by six is 0.333333333 \n 0.5 \n 0.666666667
//Which is 2/6, 3/6 and 4/6 respectively as they appear in the array
我知道如何使用普通的for循环和if语句,但我想使用它,因为我想摆脱java。
由于
答案 0 :(得分:4)
foreach
函数逐个列出/列表中的每个项目,您应该在使用之前将其设置为变量。
例如:
arr.foreach( variable_name => {
if(/*This condition is true*/){
/*Do some math and print the answer*/
}
})
答案 1 :(得分:1)
在使用filter
之前使用foreach
功能。
arr.filter(_ > 0).foreach { value => ... }
答案 2 :(得分:1)
首先,您需要使用map()
代替foreach()
,因为map()
会返回结果,而foreach()
则不会,并且只能用于副作用(应该尽可能避免。)
正如已经指出的那样,您可以filter()
之前map()
,或者可以使用collect()
将它们合并。
arr.collect{case x if x > 0 => x/6.0}
// res0: Array[Double] = Array(0.3333333333333333, 0.5, 0.6666666666666666)
答案 3 :(得分:1)
foreach
的参数是一个函数,接受一个参数,然后返回Unit
。参数是列表的当前元素,正如其他答案中所指出的那样。你可以给它一个名字,并像引用任何其他变量一样引用它。
arr.foreach { x => if(x > 0) println(x/6.0) }
将逻辑分解为一系列简单的“原子”转换而不是将所有内容都放在一个长函数中通常会更好,更惯用:
arr
.iterator
.filter(_ > 0)
.map(_ / 6.0)
.foreach(println)
上面的下划线_
是函数参数的简写。当您只需要引用一次参数时,可以在短函数中使用它,并满足一些其他条件。最后一行不需要将参数传递给println
,因为println
本身就是一个函数,被传递给foreach。我可以把它写成.foreach(println(_))
或.foreach(x => println(x))
,它会做同样的事情,但技术上有点不同:这个表单创建一个像def foo(x: Double) { println(x) }
这样的匿名函数并将其传递给{{1作为一个参数,我最初编写它的方式,只是将foreach
本身作为参数传递。
另外,请注意在开始时调用println
。如果你拿出来,一切都会以同样的方式运作。不同之处在于迭代器是懒惰的。编写它的方式,代码将从数组中获取第一个参数,通过filter发送它,如果它返回false,它将停止,然后返回第二个元素,如果filter返回true,它将发送该元素到.iterator
,然后将其打印出来,然后返回,抓住下一个元素等
没有map
调用,它的工作方式不同:首先,它将通过过滤器运行整个数组,并创建一个只包含正数的新数组,然后,它将通过map运行该新数组,并创建一个新的,数字除以6,然后它将通过最后一个数组打印出值。使用.iterator
可以避免使用所有中间副本,从而提高效率。
答案 4 :(得分:1)
var list: ListSet[Int] = ListSet(-1, -5, -3, 8, 7, 9, 4, 6, 2, 1, 0)
list.filter(p => p > 5).foreach(f => {
print(f + " ")
})
Output : 8 7 9 6
答案 5 :(得分:0)
只需做一个过滤器和地图。
不要忘记scala将你想要的数组视为Array [Int],所以如果你应用/ 6,你将得到0,通过add .toDouble确保强制转换
npm install increase-memory-limit
increase-memory-limit
结果:
val arr = Array(-1,2,3,0,-7,4)
val res = arr.filter(_>0).map(_.toDouble/6)
res.foreach(println)