用惯用功能样式替换while循环

时间:2016-11-23 22:37:30

标签: scala

下面的代码演示了两种求和值的方法,如果值达到5,则终止条件为:

   object ob extends App {

        def withoutRecursion = {

            var currentTotal = 0.0;

            while(5 > currentTotal){

                currentTotal = currentTotal + scala.util.Random.nextFloat
                println(currentTotal);

            }

        }

        def withRecursion = {

            var currentTotal = 0.0;

            def whileLoop(cond : =>Boolean)(block : =>Unit) : Unit =
                if(cond) {
                    block
                    whileLoop(cond)(block)
                }

            whileLoop(5 > currentTotal) {
                currentTotal = currentTotal + scala.util.Random.nextFloat
                println(currentTotal);
            }

      }

    }

在这种情况下,withRecursion方法是用函数编程风格替换while循环的惯用方法吗?

1 个答案:

答案 0 :(得分:5)

不是真的。在您的示例中,您仍然使用var来收集中间结果。那不是FP。

一个(很多)选项是创建一个无限但懒惰的Stream来重复必要的计算。然后,如果您想要所有中间值takeWhile(),或者只想最终结果dropWhile()

示例:

Stream.iterate(0F)(_ + util.Random.nextFloat).takeWhile(_ < 5)

这将创建一个有限Stream,其中所有值从0.0到最大总和小于5.

另一方面......

Stream.iterate(0F)(_ + util.Random.nextFloat).dropWhile(_ < 5).head

...这将为您提供大于5的第一个结果。