Вступление
С тех пор как Apple выпустила язык программирования Swift для iOS, многие разработчики Android хотели подобный язык для разработки Android. Если вы один из тех разработчиков, вы полюбите Kotlin, язык JVM, который очень похож на Swift.
Kotlin — это язык статической типизации, разработанный JetBrains, синтаксис которого более выразителен и лаконичен, чем у Java. Благодаря таким функциям, как функции высшего порядка, лямбда-выражения, перегрузка операторов, строковые шаблоны и многое другое, Kotlin может предложить гораздо больше, чем Java. Поскольку Java и Kotlin хорошо взаимодействуют друг с другом, их можно использовать вместе в одном проекте.
Если вы компетентный программист на Java, вы сможете выучить Kotlin за очень короткое время. В этом уроке я покажу вам, как использовать наиболее часто используемые конструкции Kotlin.
Предпосылки
Чтобы следовать за мной, вам понадобится:
- хорошее понимание Java.
- последняя версия компилятора Kotlin . Кроме того, вы можете использовать онлайн-игровую площадку .
1. Классы
Чтобы создать класс в Kotlin, вы должны использовать ключевое слово class
. Например, вот как вы создаете пустой класс с именем Person :
« `Java-класс Person {
} « `
Добавление свойств
Класс обычно имеет свойства и функции-члены (также называемые методами). Давайте добавим два свойства в класс Person
, имя типа String
и возраст типа Int
.
java var name: String = "" var age: Int = 0
Как видите, синтаксис для создания переменных немного отличается от синтаксиса Java. Чтобы создать переменную в Kotlin, вы должны использовать ключевое слово var
. Однако, если вы хотите, чтобы ваша переменная была переменной только для чтения / назначения один раз, используйте вместо этого ключевое слово val
.
Ради нулевой безопасности Котлин также проводит различие между переменными, которые могут быть null
и переменными, которые никогда не могут быть null
. В нашем предыдущем примере переменные name
и age
никогда не могут быть null
. Если они нулевые, компилятор выдаст ошибку.
Чтобы создать переменную, которая может содержать null
, вам нужно добавить ?
после типа переменной. Например:
java var college: String? = null
Теперь, когда у нас есть класс, создать его экземпляр легко:
java var jake = Person()
Нет, у Kotlin нет new
ключевого слова. После создания экземпляра вы можете получить доступ к его свойствам так же, как в Java:
java jake.name = "Jake Hill" jake.age = 24 jake.college = "Stephen's College"
Использование конструкторов
Инициализация отдельных свойств нашего экземпляра, как мы это сделали, не является хорошей практикой кодирования. Лучший способ сделать это — использовать конструктор. Синтаксис Котлина для создания такого конструктора очень компактен:
« `Java-класс Person (имя переменной: строка, переменная возраст: Int, колледж var: строка?) {
} « `
На самом деле, если вам больше нечего добавить в свой класс, вам не нужны фигурные скобки. Следующий код работает просто отлично:
« `java класс Person (имя переменной: строка, переменная возраст: Int, школа колледжа: строка?)
var jake = Person («Джейк Хилл», 24 года, «Колледж Стивена») « `
Для вас уже может быть очевидно, что вы не можете добавить собственный код в этот конструктор. Этот конструктор, который является частью заголовка класса, называется первичным конструктором.
Чтобы добавить больше конструкторов в ваш класс, известный как вторичные конструкторы, вы должны использовать ключевое слово constructor
. Вторичные конструкторы должны делегироваться первичному конструктору, используя ключевое слово this
. Давайте добавим вторичный конструктор в наш класс, который инициализирует значение свойства с именем email :
« `Java-класс Person (имя переменной: строка, переменная возраст: Int, колледж var: строка?) {
var email: String = "" конструктор (имя: строка, возраст: Int, колледж: строка ?, адрес электронной почты: строка): this (имя, возраст, колледж) { this.email = электронная почта }} `` `
Чтобы создать экземпляр с использованием вторичного конструктора, вы пишете что-то вроде этого:
java var jake = Person("Jake Hill", 24, "Stephen's College", "[email protected]")
Добавление функций участника
В Kotlin функции создаются с помощью ключевого слова fun
. Давайте добавим простую функцию-член с именем isElitableToVote, которая возвращает Boolean
значение:
« `java fun isElitableToVote (): Boolean {// Если возраст больше или равен 18 // вернуть true
вернуть возраст> = 18} `` `
Обратите внимание, что тип возвращаемого значения указывается в конце заголовка функции. Вы можете вызвать этот метод так же, как в Java:
java jake.isEligibleToVote()
Создание расширений
Kotlin позволяет расширять класс, добавляя в него дополнительные функции без изменения его исходного определения. Такие функции известны как расширения. Именам этих функций должны предшествовать имена классов, которые они расширяют.
Например, чтобы добавить расширение с именем isTeenager в класс Person
, вы пишете следующий код вне класса:
« `java fun Person.isTeenager (): Boolean {
// Если возраст попадает в диапазон // 13-19 возвращаем true вернуть возраст в 13..19} `` `
Эта функция особенно полезна, когда вы хотите расширить классы, которые не принадлежат к базе кода вашего проекта. Например, следующий фрагмент кода добавляет расширение containsSpaces к классу String
:
java fun String.containsSpaces(): Boolean { return this.indexOf(" ")!=-1 }
Создание производных классов
При создании производного класса важно помнить следующее:
- Вы должны использовать
:
вместо ключевого словаextends
в Java. - Заголовок базового класса должен иметь
open
аннотацию. - Если ваш базовый класс имеет конструктор, который принимает параметры, ваш производный класс должен инициализировать эти параметры в самом заголовке.
Давайте создадим класс с именем Employee, который наследуется от Person
:
« `java открытый класс Person (переменное имя: String, var age: Int, var колледж: String?) {…}
класс Employee (имя: строка, возраст: Int, колледж: String ?, var company: String): Person (имя, возраст, колледж) {
} « `
Переопределение функций-членов
В Kotlin вы должны явно указать, что функцию-член можно переопределить, используя open
аннотацию в заголовке метода в базовом классе. В производном классе открытые функции могут быть переопределены с помощью аннотации override
.
Например, чтобы переопределить метод isEligibleToVote
, добавьте следующий фрагмент кода в класс Employee
:
java override fun isEligibleToVote(): Boolean { // Always return true return true }
Создание статических методов
Котлин не позволяет создавать статические методы. Тем не менее, он позволяет вам создавать функции уровня пакета, которые не принадлежат ни одному классу.
main
метод, пожалуй, самый известный статический метод. Если вы хотите добавить метод main
в пакет с именем com.tutsplus.code.tutorial , то ваш код будет выглядеть следующим образом:
« `Java-пакет com.tutsplus.code.tutorial
веселая главная (args: Array
} « `
2. Функции
Вы уже научились создавать простые функции в предыдущих примерах. Синтаксис, который вы использовали для создания этих функций, был очень похож на синтаксис Java. Kotlin, однако, позволяет вам делать гораздо больше с функциями.
Создание функций одного выражения
Если функция возвращает значение одного выражения, вы можете использовать оператор =
после заголовка функции, за которым следует выражение, чтобы определить функцию.
Например, чтобы добавить метод к классу Person
который возвращает true
если это восьмидесятилетний человек , вы должны написать:
java fun isOctogenarian(): Boolean = age in 80 .. 89
Как видите, этот сокращенный синтаксис более компактен и читаем.
Функции высшего порядка и лямбда-выражения
Функции высшего порядка — это функции, которые могут возвращать функции или принимать функции в качестве параметров. С другой стороны, лямбда-выражение — это просто функция, у которой нет имени. Обычно лямбда-выражения и функции более высокого порядка используются вместе.
Рассмотрим следующий пример, демонстрирующий синтаксис лямбда-выражения:
java {x, y -> x+y}
Это простое лямбда-выражение, которое принимает два параметра, x
и y
, и возвращает их сумму. Как вы уже догадались, параметры функции перечислены перед оператором ->
а тело функции начинается после оператора ->
. Это лямбда-выражение может быть присвоено переменной и использовано следующим образом:
java val sumLambda: (Int, Int) -> Int = {x,y -> x+y} val actualSum = sumLambda(3,4)
Обратите внимание, что тип переменной, которая содержит лямбда-выражение, определяет типы ее параметров и возвращаемое значение.
Создать функцию более высокого порядка, которая может принимать лямбда-выражение выше в качестве параметра, так же просто. Например, чтобы создать функцию, которая удваивает результат лямбда-выражения, вы должны написать:
java fun doubleTheResult(x:Int, y:Int, f:(Int, Int)->Int): Int { return f(x,y) * 2 }
Вы можете вызвать эту функцию следующим образом:
java val result1 = doubleTheResult(3, 4, sumLambda)
Кроме того, вы можете передать лямбда-выражение непосредственно в функцию более высокого порядка:
java val result2 = doubleTheResult(3, 4, {x,y -> x+y})
Лямбда-выражения часто используются с массивами. Например, рассмотрим следующий массив значений Int
:
java val numbers:Array<Int> = arrayOf(1, 2, 3, 4, 5)
Если вы хотите возвести в квадрат значение каждого элемента в массиве, вы можете использовать функцию map
вместе с лямбда-выражением следующим образом:
« `java val squaredNumbers = numbers.map ({x -> x * x})
// Результатом будет новый массив, содержащий // 1, 4, 9, 16, 25 « `
3. Диапазоны
Выражения диапазона очень часто используются в Kotlin. Вы уже использовали их при создании методов isTeenager
и isOctogenarian
.
Для создания диапазона все, что вам нужно, это оператор ..
« `java val r1 = 1..5
// Этот диапазон содержит числа 1, 2, 3, 4, 5 « `
Чтобы создать диапазон в порядке убывания, используйте функцию downTo
.
« `java val r2 = 5 downTo 1
// Этот диапазон содержит числа 5, 4, 3, 2, 1 « `
Если вы не хотите, чтобы шаг был равен 1 , вы можете указать пользовательское значение, используя функцию step
.
« `java val r3 = 5 downTo 1 шаг 2
// Этот диапазон содержит числа 5, 3, 1 « `
Вы увидите больше выражений диапазона позже в этом уроке.
4. Условные конструкции
if
В Kotlin if
— это выражение, которое возвращает разные значения в зависимости от того, было ли выполнено условие. Следующий пример иллюстрирует, как это работает.
« `java var age = 20 val isElitableToVote = if (age> 18)« Yes »иначе« No »
// isElitableToVote теперь будет установлено в «Да» « `
when
Выражение when
эквивалентно switch
Java. Тем не менее, он намного более универсален. Например, рассмотрим следующий пример.
« `java val age = 17
val typeOfPerson = when (age) {0 -> «Новорожденный» в 1..12 -> «Ребенок» в 13..19 -> «Teenager» else -> «Adult»}
// typeOfPerson теперь будет иметь значение «Teenager» « `
Как видите, when
можно принимать не только отдельные значения, но и выражения в качестве его условий.
5. Циклические конструкции
for..in
В Kotlin вы можете использовать цикл for..in
для for..in
массивов, коллекций и всего остального, что обеспечивает итератор. Его синтаксис практически идентичен синтаксису Java, за исключением использования оператора in
вместо оператора Java :
В следующем примере показано, как перебрать массив объектов String
.
« `java val names = arrayOf (« Джейк »,« Джилл »,« Эшли »,« Билл »)
for (имя в именах) {println (name)} « `
С помощью выражений диапазона вы можете заставить этот цикл вести себя как традиционный, в стиле C, цикл for
.
« `Java для (я в 0..9) {println (я)}
// ведет себя точно так же, как // for (int i = 0; i <10; i ++) « `
while
и do..while
while
Синтаксис циклов while
и do..while
while
в Kotlin идентичен синтаксису, используемому в Java. Например, следующий код Kotlin зацикливается на массиве объектов String
используя цикл while:
« `java val names = arrayOf (« Джейк »,« Джилл »,« Эшли »,« Билл ») var i = names.size ()
while (i> 0) {println (names [–i])} « `
6. Строковые шаблоны
Kotlin позволяет встраивать переменные и выражения в строки, заключая их в пару фигурных скобок, с префиксом символа $
. Например:
« `java val name =« Bob »println (« Меня зовут $ {name} ») // Печатает« Меня зовут Боб »
val a = 10 val b = 20 println («сумма равна $ {a + b}») // печатает «сумма равна 30» « `
Вывод
В этом уроке вы изучили основы языка программирования Kotlin. Несмотря на то, что мы рассмотрели несколько конструкций, у Kotlin есть много чего предложить. Фактически, по состоянию на июнь 2015 года, Kotlin все еще доступен только в качестве предварительного просмотра. Вероятно, в ближайшие месяцы появятся несколько улучшений и новых функций.
Если вы хотите узнать, как использовать Kotlin в Android Studio, взгляните на Как использовать Kotlin в ваших проектах Android . Чтобы узнать больше о языке Kotlin, я рекомендую посетить документацию Kotlin .