Similar presentations:
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.
Функции в KotlinAndroid 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