检查scala中foreach中的条件

时间:2017-07-25 08:32:08

标签: scala foreach

有没有办法检查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。

由于

6 个答案:

答案 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)