1.32M
Category: programmingprogramming

Android Development with Kotlin v1.0

1.

Урок 2:
Функции
Android Development with Kotlin v1.0
This work is licensed under the Apache 2 license.
1

2.

План
Урок 2: Функции

Программы на Котлине

(Почти) Все имеет ценность

Функции в Котлине

Компактные функции

Лямбды и функции высшего порядка

Список фильтров

Краткое содержание
Android Development with Kotlin
This work is licensed under the Apache 2 license.
2

3.

Программы на Котлине
Android Development with Kotlin
This work is licensed under the Apache 2 license.
3

4.

Настройка
Прежде чем вы сможете писать код и запускать программы, вам
необходимо:
Создайте файл в своем проекте
Создайте функцию main()
Передайте аргументы в main() (необязательно)
Используйте любые переданные аргументы в вызовах функций
(необязательно).
Запустите свою программу
Android Development with Kotlin
This work is licensed under the Apache 2 license.
4

5.

Создайте новый файл Kotlin
На панели «Проект» IntelliJ IDEA в разделе «Hello World» щелкните правой
кнопкой мыши папку src.
● Выберите New > Kotlin File/Class.
● Выберите File, имя файла Hello, и нажмите Enter.
Android Development with Kotlin
This work is licensed under the Apache 2 license.
5

6.

Создание файла на языке Котлин
Теперь вы должны увидеть в папке src файл под названием Hello.kt.
Android Development with Kotlin
This work is licensed under the Apache 2 license.
6

7.

Создание функции main()
main() — это точка входа для выполнения программы Kotlin..
В файле Hello.kt:
fun main(args: Array<String>) {
println("Hello, world!")
}
Аргументы в функции main() не являются обязательными.
Android Development with Kotlin
This work is licensed under the Apache 2 license.
7

8.

Запуск программы на Kotlin
Чтобы запустить программу, щелкните значок( ) слева от функции main().
IntelliJ IDEA runs the program, and displays the results in the console.
Android Development with Kotlin
This work is licensed under the Apache 2 license.
8

9.

Передача аргументов в main()
Выберите Run > Edit Configurations откройте окно Run/Debug Configurations
Android Development with Kotlin
This work is licensed under the Apache 2 license.
9

10.

Использование аргументов в main()
Используйте args[0] для доступа к первому входному аргументу,
переданному в main().
fun main(args: Array<String>) {
println("Hello, ${args[0]}")
}
⇒ Hello, Kotlin!
Android Development with Kotlin
This work is licensed under the Apache 2 license.
10

11.

(Почти) Все имеет ценность
Android Development with Kotlin
This work is licensed under the Apache 2 license.
11

12.

Выражения
В Котлине почти всё является выражением и имеет значение. Даже
выражение if имеет значение.
val temperature = 20
val isHot = if (temperature > 40) true else false
println(isHot)
⇒ false
Android Development with Kotlin
This work is licensed under the Apache 2 license.
12

13.

Значения выражения
Иногда это значение — kotlin.Unit.
val isUnit = println("This is an expression")
println(isUnit)
⇒ This is an expression
kotlin.Unit
Android Development with Kotlin
This work is licensed under the Apache 2 license.
13

14.

Функции в Kotlin
Android Development with Kotlin
This work is licensed under the Apache 2 license.
14

15.

О функциях
● Блок кода, выполняющий конкретную задачу
● Разбивает большую программу на более мелкие
модульные фрагменты.
● Объявление идет с использованием ключевого
слова fun
● Может принимать аргументы с именованными
значениями или значениями по умолчанию.
15
Android Development with Kotlin
This work is licensed under the Apache 2 license.

16.

Части функции
Ранее вы создали простую функцию, которая печатает «Hello World».
fun printHello() {
println("Hello World")
}
printHello()
Android Development with Kotlin
This work is licensed under the Apache 2 license.
16

17.

Тип Unit возвращаемое функцией
Если функция не возвращает никакого полезного значения, ее тип
возвращаемого значения — Unit..
fun printHello(name: String?): Unit {
println("Hi there!")
}
Unit — это тип, имеющий только одно
значение: Unit.
Android Development with Kotlin
This work is licensed under the Apache 2 license.
17

18.

Тип Unit возвращаемое функцией
Объявление типа возвращаемого значения Unit не является обязательным.
fun printHello(name: String?): Unit {
println("Hi there!")
}
эквивалентно:
fun printHello(name: String?) {
println("Hi there!")
}
Android Development with Kotlin
This work is licensed under the Apache 2 license.
18

19.

Аргументы функции
Функции могут иметь:
● Параметры по умолчанию
● Обязательные параметры
● Именованные аргументы
Android Development with Kotlin
This work is licensed under the Apache 2 license.
19

20.

Параметры по умолчанию
Значения по умолчанию необходимы, если значение параметра не
передано.
fun drive(speed: String = "fast") {
println("driving $speed")
}
drive() ⇒ driving fast
drive("slow") ⇒ driving slowly
Используйте "=" после
типа для
определения значения по
умолчанию
drive(speed = "turtle-like") ⇒ driving turtle-like
Android Development with Kotlin
This work is licensed under the Apache 2 license.
20

21.

Обязательные параметры
Если для параметра не указано значение по умолчанию, требуется
соответствующий аргумент.
Обязательные
параметры
fun tempToday(day: String, temp: Int) {
println("Today is $day and it's $temp degrees.")
}
Android Development with Kotlin
This work is licensed under the Apache 2 license.
21

22.

Параметры по умолчанию и обязательные параметры
Функции могут иметь сочетание параметров по умолчанию и обязательных параметров.
fun reformat(str: String,
divideByCamelHumps: Boolean,
Имеет значение
wordSeparator: Char,
по умолчанию
normalizeCase: Boolean = true){
Передайте необходимые аргументы.
reformat("Today is a day like no other day", false, '_')
Android Development with Kotlin
This work is licensed under the Apache 2 license.
22

23.

Именованные аргументы
Чтобы улучшить читаемость, используйте именованные аргументы для
обязательных аргументов.
reformat(str, divideByCamelHumps = false, wordSeparator = '_')
Считается хорошим тоном помещать аргументы по умолчанию после
позиционных аргументов, таким образом вызывающим сторонам нужно
указать только необходимые аргументы.
Android Development with Kotlin
This work is licensed under the Apache 2 license.
23

24.

Компактные функции
Android Development with Kotlin
This work is licensed under the Apache 2 license.
24

25.

Функции с одним выражением
Компактные функции или функции с одним выражением делают ваш код
более кратким и читабельным.
fun double(x: Int): Int {
x * 2
Полная версия
}
fun double(x: Int):Int = x * 2
Android Development with Kotlin
Компактная
версия
This work is licensed under the Apache 2 license.
25

26.

Лямбды и функции высшего
порядка
Android Development with Kotlin
This work is licensed under the Apache 2 license.
26

27.

Функции Kotlin — высшего порядка
● Функции Kotlin могут храниться в переменных и
структурах данных.
● Их можно передавать в качестве аргументов другим
функциям более высокого порядка и возвращать из них.
● Вы можете использовать функции более высокого
порядка для создания новых «встроенных» функций.
Android Development with Kotlin
This work is licensed under the Apache 2 license.
27

28.

Лямбда-функции
Лямбда — это выражение, которое создает функцию, не имеющую имени.
Параметр и тип
var dirtLevel = 20
Функция
стрелки
val waterFilter = {level: Int -> level / 2}
println(waterFilter(dirtLevel))
Код для
выполнения
⇒ 10
Android Development with Kotlin
This work is licensed under the Apache 2 license.
28

29.

Синтаксис типов функций
Синтаксис Kotlin для типов функций тесно связан с синтаксисом лямбдавыражений. Объявите переменную, содержащую функцию.
val waterFilter: (Int) -> Int = {level -> level / 2}
Имя переменной
Тип данных
переменной(тип
функции)
Функция
Android Development with Kotlin
This work is licensed under the Apache 2 license.
29

30.

Функции высшего порядка
Функции высшего порядка принимают функции в качестве параметров или
возвращают функцию.
fun encodeMsg(msg: String, encode: (String) -> String): String {​
return encode(msg)
}
Тело кода вызывает функцию, переданную в качестве второго аргумента, и
передает ей первый аргумент.
Android Development with Kotlin
This work is licensed under the Apache 2 license.
30

31.

Функции высшего порядка
Чтобы вызвать эту функцию, передайте ей строку и функцию.
val enc1: (String) -> String = { input -> input.toUpperCase() }
println(encodeMsg("abc", enc1))
Использование типа функции отделяет ее реализацию от ее использования.
Android Development with Kotlin
This work is licensed under the Apache 2 license.
31

32.

Передача ссылки на функцию
Используйте оператор ::, чтобы передать именованную функцию в качестве
аргумента другой функции.
fun enc2(input:String): String = input.reversed()
encodeMessage("abc", ::enc2)
Передача именованной
функции,
не лямбда
Оператор :: сообщает Kotlin, что вы передаете ссылку на функцию в
качестве аргумента, а не пытаетесь вызвать функцию.
Android Development with Kotlin
This work is licensed under the Apache 2 license.
32

33.

Синтаксис вызова последнего параметра
Котлин требует, чтобы любой параметр, принимающий функцию, был
последним параметром.
encodeMessage("acronym", { input -> input.toUpperCase() })
Вы можете передать лямбду в качестве параметра функции, не заключая ее
в круглые скобки.
encodeMsg("acronym") { input -> input.toUpperCase() }
Android Development with Kotlin
This work is licensed under the Apache 2 license.
33

34.

Использование функций высшего
порядка
Многие встроенные функции Kotlin определяются с использованием
синтаксиса вызова последнего параметра.
inline fun repeat(times: Int, action: (Int) -> Unit)
repeat(3) {
println("Hello")
}
Android Development with Kotlin
This work is licensed under the Apache 2 license.
34

35.

Список фильтров
Android Development with Kotlin
This work is licensed under the Apache 2 license.
35

36.

Список фильтров
Получить часть списка на основе некоторого условия
red
red-orange
dark red
bright
orange
orange
saffron
Примените filter() на список
Условие: элемент содержит “red”
red
red-orange
Android Development with Kotlin
dark red
This work is licensed under the Apache 2 license.
36

37.

Перебор списков
Если функциональный литерал имеет только один параметр, вы можете
опустить его объявление и знак «->». Параметр неявно объявлен под
именем it.
val ints = listOf(1, 2, 3)
ints.filter { it > 0 }
Фильтр выполняет итерацию по коллекции, где это значение элемента
встречается во время итерации. Это эквивалентно:
ints.filter { n: Int -> n > 0 }
Android Development with Kotlin
OR
ints.filter { n -> n > 0 }
This work is licensed under the Apache 2 license.
37

38.

Список фильтров
Условие фильтра в фигурных скобках {} проверяет каждый элемент по
мере прохождения фильтра. Если выражение возвращает true, элемент
включается.
val books = listOf("nature", "biology", "birds")
println(books.filter { it[0] == 'b' })
⇒ [biology, birds]
Android Development with Kotlin
This work is licensed under the Apache 2 license.
38

39.

Нетерпеливые и ленивые фильтры
Оценка выражений в списках:
● Нетерпеливые: происходит независимо от того,
использовался ли когда-либо результат.
● Ленивый: происходит только в случае необходимости во
время выполнения.
Ленивая оценка списков полезна, если вам не нужен весь результат или
если список очень велик и несколько его копий не помещаются в ОЗУ.
Android Development with Kotlin
This work is licensed under the Apache 2 license.
39

40.

Нетерпеливые фильтры
Фильтры активны по умолчанию. Новый список создается каждый раз,
когда вы используете фильтр.
val instruments = listOf("viola", "cello", "violin")
val eager = instruments.filter { it [0] == 'v' }
println("eager: " + eager)
⇒ eager: [viola, violin]
Android Development with Kotlin
This work is licensed under the Apache 2 license.
40

41.

Ленивые фильтры...
Последовательности — это структуры данных, которые используют
ленивые вычисления и могут использоваться с фильтрами, чтобы сделать
их ленивыми.
val instruments = listOf("viola", "cello", "violin")
val filtered = instruments.asSequence().filter { it[0] == 'v'}
println("filtered: " + filtered)
⇒ filtered: kotlin.sequences.FilteringSequence@386cc1c4
Android Development with Kotlin
This work is licensed under the Apache 2 license.
41

42.

Последовательности -> списки
Последовательности можно снова превратить в списки с помощью
toList().
val filtered = instruments.asSequence().filter { it[0] == 'v'}
val newList = filtered.toList()
println("new list: " + newList)
⇒ new list: [viola, violin]
Android Development with Kotlin
This work is licensed under the Apache 2 license.
42

43.

Другие преобразования списка
● map() выполняет одно и то же преобразование для каждого элемента
и возвращает список.
val numbers = setOf(1, 2, 3)
println(numbers.map { it * 3 })
=> [3, 6, 9]
● flatten() возвращает единый список всех элементов вложенных
коллекций.
val numberSets = listOf(setOf(1, 2, 3), setOf(4, 5), setOf(1, 2))
println(numberSets.flatten())
=> [1, 2, 3, 4, 5, 1, 2]
Android Development with Kotlin
This work is licensed under the Apache 2 license.
43

44.

Краткое содержание
Android Development with Kotlin
This work is licensed under the Apache 2 license.
44

45.

Краткое содержание
На Уроке 2 вы узнали, как:
Создание файла и функции main() в проекте и запуск программы.
Передача аргументов в функцию main()
Использование возвращаемого значения выражения
Использование аргументов по умолчанию для замены нескольких
версий функции
● Использование компактных функций, чтобы сделать код более
читабельным.
● Использование лямбды и функции высшего порядка.
● Использование нетерпеливых и ленивых фильтров списков
Android Development with Kotlin
This work is licensed under the Apache 2 license.
45

46.

Практическое занятие
Практикуйте то, что вы узнали,
пройдя по ссылке:
Lesson 2: Functions
Android Development with Kotlin
This work is licensed under the Apache 2 license.
46
English     Русский Rules