Руководство по Scala. Циклы.

В данной статье мы рассмотрим работу с циклами в языке программирования Scala.

В процессе разработки мы часто сталкиваемся с ситуацией, когда нам необходимо много раз повторять одно и то же действие.

В виде блок-схемы это выглядит следующим образом:

loops

Есть логическое выражение. Пока оно истинно – цикл повторяется, как только выражение становится ложным – поток исполнения выходит из цикла.

В Scala, как и в Java есть 3 вида циклов:

Цикл и его описание
1 while

Выполняет блок кода, пока заданное логическое выражение истинно. Проверка происходит перед выполнением тела цикла.

2 do-while

Данный цикл имеет такое же поведение, как и цикл while, за исключением того момента, что выполнение происходит до проверки логического выражения. Т.е. тело цикла выполнится, как минимум, один раз.

3 for

Выполняет блок кода в соответствии с условиями заданными в самом цикле.

Рассмотрим каждый из этих циклов отдельно.


Цикл while
В программе ниже у нас есть переменная counter. Перед выполнением тела цикла мы проверяем, верно ли условие. Пока counter не равен 6 тело цикла выполняется, а после – происходит выход из цикла.


package net.proselyte.scalatutorial.loops

/**
  * Simple Scala class that demonstrates loop While.
  *
  * @author Eugene Suleimanov
  */

object WhileDemo {
  def main(args: Array[String]) {
    var counter: Integer = 1;

    while (counter <=5 ) {
      println(counter)
      counter += 1;
    }
  }
}

В результате выполнения программы мы получим следующий результат:


1
2
3
4
5

Process finished with exit code 0

Цикл do while

Данный цикл имеет следующую общую форму записи:


do {
   блок кода
} 
while( ЛОГИЧЕСКОЕ ВЫРАЖЕНИЕ );

Для понимания того, как это работает на практике, рассмотрим простой пример:


package net.proselyte.scalatutorial.loops

/**
  * Simple Scala class that demonstrates loop Do/While.
  *
  * @author Eugene Suleimanov
  */

object DoWhileDemo {
  def main(args: Array[String]) {
    var counter: Integer = 1;

    do {
      println(counter);
      counter += 1;
    } while (counter < 5);
  }
}

В результате выполнения программы мы получим следующий результат:


1
2
3
4

Process finished with exit code 0

Цикл for

Данный цикл имеет следующий общий вид:


for( var counter <- Диапазон ){
   метод(s);
}

Рассмотрим простой пример:


package net.proselyte.scalatutorial.loops

/**
  * Simple Scala class that demonstrates loop For.
  *
  * @author Eugene Suleimanov
  */

object ForLoopDemo {
  def main(args: Array[String]) {
    for (counter <- 0 to 5){
       println(counter);
    }
}

В результате выполнения программы мы получим следующий результат:


0
1
2
3
4
5

Process finished with exit code 0

Цикл for также крайне хорошо подходит для работы с коллекциями. Рассмотрим следующий пример:


package net.proselyte.scalatutorial.loops

/**
  * Simple Scala class that demonstrates loop For with Collections.
  *
  * @author Eugene Suleimanov
  */

object ForLoopCollectionDemo {
  def main(args: Array[String]) {
    val integerList = List(10, 20, 30, 40, 50);

    for (counter <- integerList ){
       println(counter);  
    }
  }
}

В результате работы данной программы мы получим следующее:


10
20
30
40
50

Process finished with exit code 0

Как мы видим, в данном примере, у нас есть коллекция. С помощью цикла for мы поочерёдно получаем доступ ко всем элементам коллекции.

Также, стоит отдельно отметить ключевое слово yield, которое позволяет нам получать значение из цикла.

Данная конструкция имеет следующий общий вид:


   var someReturnValue = for{ var counter <- List
      if условие1; if условие2...
   }
   yield counter

Рассмотрим следующий пример:


package net.proselyte.scalatutorial.loops

/**
  * Simple Scala class that demonstrates loop For with Yield.
  *
  * @author Eugene Suleimanov
  */

object ForLoopYieldDemo {
  def main(args: Array[String]) {
    val integerList = List(10, 20, 30, 40, 50);

    val filteredValue = for {counter  <- integerList if counter!= 10; if counter < 50} 
    yield counter;

    for(counter <- filteredValue){
       prinln(counter);
    }
   }
  }

Результат работы данной программы следующий:


20
30
40

Process finished with exit code 0

Как видим, мы оставили только те значения, которые удовлетворяют условиям !=10 и <50


Прерывание цикла

При разработке программного обеспечения мы можем столкнуться с необходимостью прервать цикл при определённом условии.
Для этих целей в Scala используется ключевое слово break.
Рассмотрим следующий пример:


package net.proselyte.scalatutorial.loops

import scala.util.control.Breaks

/**
  * Simple Scala class that demonstrates keyword break in loop.
  *
  * @author Eugene Suleimanov
  */

object BreakLoopDemo {
  def main(args: Array[String]) {
    val loop = new Breaks;

    loop.breakable({
      for(counter <- 1 to 10){
         println(counter);
         if(counter == 5){
            loop.break;
         }
      }
     })
   }
}

Результатом работы данной программы будет следующий вывод в консоль:


1
2
3
4
5

Process finished with exit code 0

Здесь мы видим, что изначально мы должны выполнить цикл 10 раз, но, когда counter становится равен 5, мы прерываем цикл с помощью оператора break.

На этом мы заканчиваем изучение циклов в Scala.
В следующей статье мы рассмотрим массивы в данном языке программирования.