Kotlin. Оператор when

Оператор when


Содержание


Поиск на других ресурсах:

1. Оператор when. Назначение. Синтаксис объявления

Оператор when используется для реализации выбора одного варианта из нескольких. Оператор when в языке Kotlin является аналогом оператора switch в языках Java, C#, C/C ++ только с более широкими возможностями. Оператор when позволяет оперировать произвольными объектами в отличие от оператора switch других языков, в котором использовались только константы.

Оператор when эффективен, когда количество вариантов (проверок условий) составляет три и более.

Синтаксис объявления оператора when разнообразен и в наиболее общем случае имеет следующий вид

when (name) {
  value1 -> statements_1
  value2 -> statements_2
  ...
  valueN -> statements_N
  else -> statements_N+1
}

здесь

  • name — имя аргумента, который определяет перечень возможных значений value1, value2, …, valueN;
  • value1, value2, valueN — значения, которые получает переменная (ссылка) name. Эти значения могут быть отдельными литералами, интервалами, переменными. Также допускается вставлять вызовы функций, которые возвращают значение такого же типа который имеет переменная name;
  • statement_1, statement_2, statement_N — один или несколько операторов, которые нужно выполнить если найдено совпадение name соответственно с value1, value2, valueN. Если нужно выполнить два и более операторов, то они берутся в фигурные скобки { };
  • statement_N+1 — один или более операторов, которые выполняются в случае, когда не найдено ни одного совпадения между name и value1, value2, valueN.

Оператор when работает следующим образом. Сначала сравнивается значение name со значением value1. Если значения совпадают (равны), то выполняется оператор (блок операторов) statement1 и дальше происходит переход к следующему оператору, следующему после оператора when. Если значение name и value1 не совпадают, то рассматривается значение value2, которому соответствует оператор (несколько операторов) statement2.

Если в ходе проверок на равенство не найдено совпадений для N значений, то выполняется оператор statement_N+1.

 

2. Использование оператора when с различными объектами. Примеры
2.1. Определение названия дня недели

Задача. Задан номер дня недели (1..7). По этому номеру вывести название дня недели. Считать, что понедельник имеет номер 1.

Решение.

 

fun main(args:Array<String>) {
  val day : Int

  print("day = ")
  day = readLine().toString().toInt()

  when (day)
  {
    1 -> println("Monday")
    2 -> println("Tuesday")
    3 -> println("Wednesday")
    4 -> println("Thirsday")
    5 -> println("Friday")
    6 -> println("Saturday")
    7 -> println("Sunday")
    else -> println("Incorrect input.")
  }
}

Тестовый пример

day = 3
Wednesday

 

2.2. Определение времени года по названию месяца. Групповая обработка в операторе when

В примере показано, что оператор when можно применять к группе элементов и диапазонов.

Задача. По введенному номеру месяца вывести название времени года, к которому этот месяц относится.

Решение.

fun main(args:Array<String>) {
  // 1. Объявить переменные
  val month : Int

  // 2. Ввести номер месяца
  print("month = ")
  month = readLine().toString().toInt()

  // 3. Вычисление. Вывести название времени года
  when (month)
  {
    1, 2, 12 -> println("Winter")
    in 3..5 -> println("Spring") // указывается диапазон
    in 6..8 -> println("Summer")
    in 9..11 -> println("Autumn")
    else -> println("Incorrect input.")
  }
}

Тестовый пример

month = 6
Summer

 

2.3. Оператор when без аргументов. Использование оператора when как составляющей условного выражения. Пример

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

Пример. Разработать программу, которая определяет, высокосный год или нет.

fun main(args:Array<String>) {
  // Оператор when без аргументов. Определение высокосного года
  // 1. Объявить переменные
  val year : Int

  // 2. Ввести год
  print("year = ")
  year = readLine().toString().toInt()

  // 3. Проверка на корректность ввода
  if (year < 0) {
    println("Incorrect input.")
    return
  }

  // 4. Вычисление
  // Условнове выражение + оператор when
  val leap_year : Boolean = when {
    year % 400 == 0 -> true
    year % 100 == 0 -> false
    year % 4 == 0 -> true
    else -> false
  }

  // 5. Вывести результат
  if (leap_year)
    println("Leap year")
  else
    println("Not a leap year")
}

Тестовый пример

year = 998400
Leap year

 

2.4. Пример. Использование сложных выражений в операторе when

Задача. С начала 1990 года по некоторый день прошло n месяцев и 2 дня. Определить название месяца этого дня (январь, февраль и т.д.).

Решение.

Поскольку в условии задачи сказано «C начала 1990 года …», то это означает, что будет 1 января 1990. В соответствии с этим решается задача.

 

fun main(args:Array<String>) {

  // Оператор when. Определение месяца в году   
  // 1. Объявить переменные
  val n : Int

  // 2. Ввести количество месяцев n
  print("n = ")
  n = readLine().toString().toInt()

  // 3. Проверка на корректность ввода
  if (n < 0) {
    println("Incorrect input.")
    return
  }

  // 4. Вычисление
  // Условное выражение, аргументом есть выражение
  val month = when (n % 12) {
    0 -> println("January")
    1 -> println("February")
    2 -> println("March")
    3 -> println("April")
    4 -> println("May")
    5 -> println("June")
    6 -> println("July")
    7 -> println("August")
    8 -> println("September")
    9 -> println("October")
    10 -> println("December")
    11 -> println("November")
    else -> println("Incorrect input.")
  }
}

Тестовый пример

n = 3
April

 

2.5. Использование строкового типа в качестве аргумента

Задача. Задано полные названия дней недели, которые начинаются с большой буквы. Определить их порядковый номер. Считать, что понедельник имеет номер 1.

Решение.

fun main(args:Array<String>) {

  // Оператор when. Аргументом выступает тип String
  // 1. Объявить переменные
  val day : String

  // 2. Ввести название дня недели
  print("day = ")
  day = readLine().toString()

  // 3. Вычисление
  // Оператор when, аргументом есть тип String
  val num_day = when(day){
    "Monday" -> 1
    "Tuesday" -> 2
    "Wednesday" -> 3
    "Thirsday" -> 4
    "Friday" -> 5
    "Saturday" -> 6
    "Sunday" -> 7
    else -> "Incorrect input."
  }

  // 4. Вывод номера дня
  println("num_day = " + num_day)
}

Тестовый пример

day = Thirsday
num_day = 4

 


Связанные темы