📘
Dev & Ops
Programming
Programming
  • Programming Book
  • Technologies
    • API
      • Известные API
        • Facebook API
      • Проектирование API
        • Программы для проектирования
          • Конвертация между форматами
          • Postman
          • Swagger
        • Webhooks
        • GraphQL
          • Введение
          • Introspection
        • RPC
          • Описание
          • gRPC
          • XML-RPC
          • SOAP
            • About
            • wsdl
          • JSON RPC
        • REST API
        • SAML
      • Program's API
        • Общие понятия
        • DOM API & элементы веб-браузера
        • Известные API
          • Google API
          • Telegram Bot API
      • Получение данных с сервера / AJAX
      • Хранение данных на стороне клиента
        • Подходы
        • Подробнее
          • Web Storage API
          • IndexedDB
          • Service Worker API
          • Cache API
    • WEB
      • Modern Web Application Architecture
      • PWA
      • Стеки технологий
        • JAMstack
        • LAMP
        • MEAN
        • MERN
      • The World Wide Web Consortium (W3C)
    • Архитектура сервисов
      • No-code / Low-code
        • Databases
        • Платформы для запуска и исполнения произвольных процессов и вычислений
        • Генераторы сайтов
      • Архитектурные паттерны
        • Papers
        • Инструменты визуализации и моделирования архитектуры
        • Архитектура проекта
          • Альтернативы
          • Feature-Sliced Design
          • MVC
          • DDD | Domain-Driven Design
          • Clean Architecture
          • Hexagonal
        • Архитектура кода
          • Papers
          • Singleton
          • Retry
          • Circuit Breaker
          • Общение между компонентами
            • Intro
            • Observer
            • PubSub
          • ООП
        • Архитектура систем
          • Monolith
          • API Gateway
          • CQRS
          • Microservices
          • Service Mesh
            • Для чего
            • Kuma
            • Istio
            • Hashicorp Consul
      • Telemetry
        • OpenTelemetry Concepts
        • Metrics
        • Tracing
        • Logs collect
      • Testing
      • Построение админок
      • Cases
      • Брокеры сообщений
        • Why?
        • RabbitMQ
        • RedisMQ
        • AWS SQS
        • Apache Kafka
        • ZeroMQ
        • Apache ActiveMQ
        • IronMQ
      • Автоматизация сборок
        • Makefile
      • Subscriptions
      • Zero Trust
    • Визуализация информации
      • Design/Совместная разработка интерфейсов
      • Работа с данными
      • Схемы, графы, рисунки..
        • Работа с графами
        • Рисуем структуру базы
        • Miro App
        • Рисование детских диаграмм
        • draw.io
        • Xmind
      • Куда заливать видео
      • yEd
      • LaTeX + PGF/TikZ
    • Version Control Systems
      • Git
      • Github
    • Programs
      • Adobe Alternatives
      • Atlassian
        • Jira
        • Confluence
      • Базы данных
        • LevelDB
      • Google Products for Developers
      • Open source
      • Фреймворки
      • vscode
      • Сборка проектов
      • Regular expressions
      • Browsers
    • Библиотеки
      • Полнотекстовой поиск
      • Парсинг грамматик
      • Регулярные выражения
      • Решение практических проблем ML
      • Chrome Cast
    • AI
      • Учимся использовать AI
      • Core Tech
      • Практическое использование
        • Assistants
        • Code assistants
        • Security
        • Web & Design
    • Dev portals
    • Разработка игр
  • Management
    • (draft) Product Management
      • Проработка идеи нового сервиса
      • Построение гипотез
    • Goals management
      • Определения и тезисы
      • OKR
      • KPI
      • OKR vs KPI
  • Programming Languages
    • Learn materials
    • Code Quality
    • Security Coding Styles
    • Testing
      • Integration testing
    • Other non programming languages
      • YAML
      • Proto
      • SQL
        • Create table
        • WITH operator
        • Time sleep
    • Bash
      • Простые операции
        • Работа с файлами
        • Untitled
        • trim
      • Процессы
    • PowerShell
      • IDE
      • Запуск скриптов
      • Удаленный запуск скриптов (with privesc)
      • Копирование файлов и директорий
      • Основы/Описание команд некоторых
      • Papers & Books
      • Примеры
        • Get-Help
        • Скачать файл
        • Импорт модулей и скриптов
        • Создание объекта Credential
        • Пользователи
        • Simple HTTP Server
    • Swift
    • ActionScript
    • Backend
      • Build & Distribution
        • cookiecutter
        • meson
        • Fastlane
        • Maven
        • Gradle
        • Apache Ant
      • JVM
        • Java Env Manager
        • Java
          • Build and Run Simple Script
          • jshell & jrunscript
          • Basic Serialization and Deserialization Java Object
          • Libraries
        • Scala
        • Kotlin
          • Intro
          • Basics
          • Async Programming
          • Логирование
          • Frameworks
            • Kotlin stdlib
            • HTTP
            • Documentation
        • Frameworks
          • Jersey Rest API
          • Spring Framework
            • About
            • Spring Boot AutoConfiguration
            • Spring IoC
            • Spring MVC
            • Spring Boot
            • Other Spring Annotations
          • Struts 2
        • Security
      • JS/TS
        • Lerna
        • Gulp
        • Frameworks
          • Templating libraries
          • Nest.js
          • Fastify
          • Express.js
          • Koa.js
      • Go
        • Get Started
          • Basic
          • Golang документация
          • Golang VSCode IDE
          • GOPATH and GOROOT
          • Сценарии на Go
        • Общее
          • Операторы и встроенные функции
          • Указатели и ссылки
          • Типизация
            • Простые типы
            • Составные типы
            • Пользовательские типы
            • Сокращенное и полное объявление переменной или константы
            • Строки
            • Срезы
            • Работа с типами
          • Коллекции
            • Перечисления
            • Массивы и срезы
            • Отображения
          • Процедурное программирование
            • Ветвления
              • if
              • select
              • switch
            • Циклы
            • Функции и методы
          • ООП
            • Ключевые понятия
            • Интерфейсы
            • Нюансы и ограничения
          • Generics in Go
          • Параллельное программирование
            • go-подпрограммы
            • Каналы обмена данными
            • Проблемы в параллельном программировании и пути их решения
        • Packages
          • Установка пакетов
          • Импортирование локальных пакетов
          • Базовые
            • Списком
            • context
          • Сторонние
            • Общепризнанные
            • Абстракции
            • Микросервисы
              • go-micro
              • gRPC Ecosystem
              • Go kit
                • About
                • Пример
                • Middlewares
                • Общение с другими микросервисами
            • GUI Decktop
            • web
            • Protocols
            • Network
            • FileSystem
            • Files & Databases
            • Testing, Profiling
            • Others
        • Debugging
        • Testing
        • Diagnostics
        • Godoc
        • Books
        • Примеры
          • Hello world
          • Узнать ОС
          • Типы
          • Файлы
          • HTTP-сервер
          • Test HTTP Request
          • RabbitMQ with Go
        • Проблемы
          • _cgo_export.c:3:10: fatal error: 'stdlib.h' file not found
        • Tools Powered on Go
        • Go Security
      • Ruby
        • Use Ruby Env and Deps
        • VSCode Ruby extensions
        • Ruby Language Guide
          • Comments
          • Variables
          • Strings
          • Ranges
          • Arrays
          • Methods
          • Flow Control
          • Classes
          • Dependencies
        • Cases
          • WebSocket Server
        • Frameworks
          • Web: Sinatra
          • Web: Padrino
          • Web: Ruby on Rails
            • Getting Started
            • Routes
            • Controllers
            • Modules
            • Rails Security
              • Common Security Issues
                • Common
                • Deserialisation
                • SQLi
              • Ruby CVEs
              • Security Tools
              • Papers
          • Middleware: Rack
          • Test: RSpec
      • Python
        • Basic
          • Install
          • Enum
          • Collections
          • Operators
          • Reflection
          • Tips
        • Advanced
          • Venv
          • Include Other Languages Libs
          • Время выполнения операции
          • Работа с контекстом
          • Работа с текстом, числами и объектами
          • Работа с файлами и IO
          • Запуск других программ
          • Работа с функциями
          • Работа с классами
          • Работа с итераторами
          • Работа с генераторами
          • Работа с многопоточностью
          • Создание CLI
          • tqdm
          • pydantic
        • Packaging
          • Intro
          • Install packages / Build Frontends
            • pip
            • pipx
            • hatch
            • poetry
          • Организация кода
            • src-layout vs flat-layout
            • namespaces
            • Plugins
          • Конфигурация
            • Papers
            • pyproject.toml
            • setup.py
            • setup.cfg
        • Packages
          • Public Lists of Python Packages
          • Linters
          • True Python
          • Network
          • Web
            • Simple HTTP Server
            • ASGI Python Web Servers
            • Http Client
              • aiohttp
              • requests
              • Packages
            • selenium
            • zeep [SOAP]
          • Web Frameworks
            • Bootle
            • FastAPI
            • Flask
            • Django
              • Intro
              • Django Admin
              • Django Signals
              • Security
            • Tornado
          • Databases
            • boto3
            • Mongo
            • Postgres
            • SQLAlchemy
          • Асинхронная обработка сообщений / работа с очередями
            • Celery
            • Others
          • Обработка информации
            • Работа с графами
            • plist
            • HAR
            • Лингвистика
            • Обработка изображений
            • Parsing HTML
            • Parsing JS
            • Beatifiers
            • XML -> Dictionary
            • Извлечение текста из pdf
            • Санитайзеры
            • Document converter
            • Генерация PDF документов
            • Parse and generate CSS
            • PDF Parser
          • Qt/QML
          • Python script -> binary file
          • Разное
          • Math & Crypto
          • Работа с другими сервисами
          • pwn & re
        • Patterns
          • Singleton
          • Factory
        • Testing
          • Intro
          • Pytest CLI
          • Markers
          • Fixtures
          • Mocking
          • Plugins
          • Configuration
          • Unit tests
        • Errors
        • Papers & Books
        • Python Security
      • .Net
        • dotnet
        • NuGet
        • Интроспекция .Net решения
      • ASP.NET
        • Поднимаем тестовое приложение
        • Структура папок ASP.Net проекта
          • ASP.NET Core
          • ASP.NET MVC
          • Classic ASP.NET WebApp
        • ASPX
          • examples
            • Hello world
        • Security
      • Perl
        • cpan
      • PHP
        • Getting Started
        • Basic
        • Magic Methods
        • Examples
          • Phar
          • Работа с файлами
          • Usefull small examples
          • Поднять инфру для разработки
          • Simple page with GET param
        • Packages
        • Frameworks
          • Yii
          • Laravel
            • Intro
            • Getting Started
            • Docker
            • Pentest
          • Zend
          • Symfony
          • CodeIgniter
          • Moodle
        • Libraries
        • Security
      • C/C++
        • Security
        • IDE
        • Build
          • Compilers
            • GCC
            • MinGW
            • Clang
            • MSVC
          • cmake
        • Cases
          • Как подключить .Lib/.h статическую библиотеку в свой проект VS/C/C++
          • Disable stdafx and other features in VS
          • Если не компилируются стандартные библиотеки в Visual Studio 2015
    • Frontend
      • Инструменты
      • HTML
        • Введение
        • Примеры
          • iframe
          • Страница со ссылкой
          • Сворачиваемый блок кода
          • Перейти на другую страницу по нажатии кнопки
          • Элементы, которые могут содержать ссылки
          • GET-запрос
          • Форматирование: оборачивание входного текста в блок (например при чтении локально файла или кода)
          • Random Color для всех элементов
        • Papers & Notes
      • CSS
        • Basic
        • Селекторы
          • О селекторах
          • Наследование стилей
          • Объявление и приоритеты
          • Псевдоклассы
        • CSS Свойства
          • Цвет
          • Шрифты и типографика
          • Стилизация абзацев
          • Блочная модель и отступы
          • Строчные и блочно-строчные элементы
          • Размеры элементов
          • Тени
          • Прокрутка элементов
          • Rotation
        • CSS Processors
        • Переменные
        • Браузерные стили
        • Стратегии верстки
          • Блочная и табличная верстки
          • Блочная верстка
          • Flexbox верстка
          • Grid Layout верстка
        • Frameworks
          • Gravity UI
          • Material Design
          • Materialize
          • Bootstrap
        • Советы
        • Papers
      • JS/TS
        • JavaScript
          • About
          • Basic JS
          • Async JS
          • RxJs
          • Guide
            • Proxy
            • Reflect
          • Cases
            • Борьба с CORS и Local File Read в браузере
            • Корректно нормализируем пути в JS
            • Тестирование работы с медленными ответами (slow js http response)
            • JSessionID
            • RCE
            • Замер времени отработки запроса
            • Периодические операции
            • postMessage
            • Самый простой редирект на странице
            • HTTP запросы и обработка ответов из JS
            • Использование сторонних скриптов
            • Отображение результатов списком
        • TypeScript
          • Init
          • Типы
            • Abstract classes, interfaces and types
            • Базовые типы и создание своих типов
            • Создание объектов
            • Создание сложных типов: Interfaces
            • Enums
            • Null Safe
            • Работа со строками и массивами
          • Ветвление кода и циклы
          • Фукнции и классы
            • Functions
            • Classes
          • Guards (проверка типов)
          • Generic-типы
          • Декораторы
          • Namespaces
          • Модули
          • Вспомогательные операторы
          • Дополнительные инструменты
          • Разные соглашения
        • Libraries
        • Frameworks
          • Web
            • React
              • Getting Started
              • Deploy
              • Packages
              • Security
              • Frameworks
                • Next.js
                • Remix
                • Gatsby
            • Vue.js
              • Nuxt.js
            • Angular
              • About
              • Основы фреймворка
                • Get Started
                • Angular CLI
                • Basic
                • Material Design Support
                • Components
                  • Introduction
                  • Lifecycle
                  • Create components
                  • Component Interaction
                  • Content Projection
                  • Dynamic components
                  • Angular Elements
                • Templates
                  • Text interpolation
                  • Template statements
                  • Pipes
                • Directives
                • Routing
                • Работа с сервисами
              • Packages
                • Списком
                • NgRx
                  • About
              • Cases
                • RxJs WebSockets
                • Errors
                • Code Styles And Best Practices
                • Примеры сайтов на Angular
            • SvelteJS
            • Others
              • jQuery
              • Meteor
              • AngularJS
              • Ext JS / Sencha
          • Mobile & Desktop
            • ReactNative
              • npx/react-native cli
            • Electron.js
          • State Managers
          • Rendering
          • i18n: Format.JS
        • Packet Managers
        • JS Runtime
          • Node.js
          • Deno
        • Other projects
      • CMS
      • Особенности WebStorm IDE
      • Dart/Flutter
        • About
        • Install
        • Packages & Plugins
        • Build & Run
        • Patterns
        • Dart
          • Intro
          • Variables
          • Functions
          • Operators
          • Control flow statements
          • Exceptions
          • Classes
          • Generics
          • Libraries and visibility
          • Asynchrony support
          • Generators
          • Isolates
          • Typedef
          • Packages
        • Flutter
          • Flutter CLI
          • pubspec.yaml
          • Widgets
          • Codelabs
          • Packages
          • Distribution
        • Dart & Flutter Playground
        • Кто использует Flutter
        • Papers & Tutorials
      • Сборщик JS/TS приложений
        • TODO: Webpack
        • TODO: Parcel
        • TODO: Rollup
      • Компиляторы
        • Babel
      • Testing
      • Learning
  • Others
    • Licenses
    • Фотостоки
    • Как оформить свой Github
    • Правила версионирования
    • Правила оформления коммитов
    • Стили именования переменных и классов
    • Language for IoT dev — TOIT
    • Online IDE
    • Документация по API по разным языкам в одном месте
    • Скиллы как специалиста
      • RoadMap для разных направлений
      • Задачи на программирование
      • Алгоритмы
      • Разработчик
      • Web-разработчик
      • DevOps
      • Бумажная ИБ
      • Компании ИБ
Powered by GitBook
On this page
  • Documentation
  • Packages
  • Vars, constants and comments
  • Classes and Functions
  • Functions
  • Static Functions
  • Extensions
  • Возвращение нескольких типов данных из функций
  • Strings
  • Шаблоны
  • Дополнить строку символами
  • Подстроки
  • Встроенные функции
  • String -> Hex String
  • Циклы, ветвления, групповые операции
  • Nullable
  • Коллекции
  • Ленивые свойства
  • Синглтон
  • Reflection
  1. Programming Languages
  2. Backend
  3. JVM
  4. Kotlin

Basics

PreviousIntroNextAsync Programming

Last updated 2 years ago

Documentation

Документация (Language Guide):

Packages

package ctf.zone.pwn  
// Имя пакета указывается в начале исходного файла, так же как и в Java
// Но в отличие от Java, нет необходимости, чтобы структура пакетов совпадала со структурой папок: 
// исходные файлы могут располагаться в произвольном месте на диске.


import java.lang.IllegalStateException
import java.util.*
import java.io.File

Vars, constants and comments

val PI = 3.14 // test comment
var global_var = 0

/* Блочный комментарий из
нескольких строк */

Classes and Functions

Functions

class KotlinClass {
    fun sum(a: Int, b: Int): Int {  // Функция принимает два аргумента Int и возвращает Int
        return a + b
    }

    fun sum(a: Int, b: Double) = a + b // Функция с выражением в качестве тела и автоматически определенным типом возвращаемого значения

    fun printSum(a: Int, b: Int): Unit {  // Функция, не возвращающая никакого значения (void в Java):
        print(a + b)
    }

    fun printSum(a: Int, b: Double) {  // Тип возвращаемого значения Unit может быть опущен
        print(a + b)
        println("jsfvkjsdfg")
    }

    fun variables() {
        // Неизменяемая (только для чтения) внутренняя переменная
        val a: Int = 1
        val b = 1   // Тип `Int` выведен автоматически
        val c: Int  // Тип обязателен, когда значение не инициализируется
        c = 1       // последующее присвоение


        // Изменяемая переменная
        var x = 5 // Тип `Int` выведен автоматически
        x += 1

        // Изменение глобальных переменных
        global_var += 1
    }
}

Static Functions

// Static functions
class MainActivity : AppCompatActivity() {
    companion object {
        // PARAM_RESULT — Static Field
        val PARAM_RESULT: String = "com.zfr.network.extra.RESULT" 
        fun test() {
            
        }
    }    
}

Extensions

Это функции-расширения

// Функции-расширения
fun String.spaceToCamelCase() { return }
"Convert this to camelcase".spaceToCamelCase()

Возвращение нескольких типов данных из функций

Если надо ветвить логику - на исключениях

Strings

Шаблоны

fun string_patterns(args: Array<String>, test: Any) {
        /*
        Допустимо использование переменных внутри строк в формате $name или ${name}
         */
        if (args.size == 0) return
        else print("kjkfgd")

        print("Первый аргумент: ${args[0]}")

        var a = 1
        // просто имя переменной в шаблоне:
        val s1 = "a равно $a"

        a = 2
        // произвольное выражение в шаблоне:
        val s2 = "${s1.replace("равно", "было равно")}, но теперь равно $a"

        /*
          Результат работы программы:
          a было равно 1, но теперь равно 2
        */
}

Дополнить строку символами

val name = "Barsik"
val pad = name.padStart(10, '#')
println(pad) // ####Barsik

val name = "Barsik"
val pad = name.padEnd(10, '*')
println(pad) // Barsik****

Подстроки

// подстрока с указанного индекса
val result = "developer.alexanderklimov.ru".substring(10) // alexanderklimov.ru

// подстрока до первого указанного разделителя
val first = "developer.alexanderklimov.ru".substringBefore('.') // developer

// подстрока после первого указанного разделителя
val last = "developer.alexanderklimov.ru".substringAfter('.') // alexanderklimov.ru

// подстрока после последнего указанного разделителя
val last = "developer.alexanderklimov.ru".substringAfterLast('.') // ru

// подстрока до последнего указанного разделителя
val beforeLast = "developer.alexanderklimov.ru".substringBeforeLast('.') // developer.alexanderklimov

Встроенные функции

val blank = "   ".isBlank() // true, если пустая строка или пустые символы пробела, табуляции и т.п.

// индекс последнего символа
val lastIndex = "Кот Мурзик".lastIndex // 9

// переводим в верхний регистр первый символ строки
// decapitalize() выполняем обратную задачу
val capitalize = "кот Мурзик".capitalize()

val withSpaces = "1".padStart(2) // добавляем пробел перед строкой
val endZeros = "1".padEnd(3, '0') // "100"  добавляем нули в конец

val dropStart = "Kotlin".drop(2) // "tlin" убираем первые символы в указанном количестве
val dropEnd = "Kotlin".dropLast(3) // "Kot" убираем последние символы в указанном количестве

// возвращаем строку без первого символа, который удовлетворяет условию
val string = "Мурзик"
val result = string.dropWhile{
    it == 'М'
}
textView.text = result // урзик

// возвращаем строку без последнего символа, который удовлетворяет условию
val string = "Мурзик"
val result = string.dropLastWhile{
    it == 'к'
}
textView.text = result // Мурзи

// разбиваем на массив строк
"A\nB\nC".lines() // [A, B, C]
"ABCD".zipWithNext() // [(A, B), (B, C), (C, D)]

// удаляем символы из заданного диапазона
val string = "Кот, который гулял сам по себе"
val result = string.removeRange(
    3..28 // range
)

// удаляем префикс из строки
val string = "Кот, который гулял сам по себе"
val result = string.removePrefix("Кот")

// удаляем суффикс из строки
val string = "Кот, который гулял сам по себе"
val result = string.removeSuffix("себе")

// удаляем заданный разделитель, который должен окружать строку с начала и с конца
val string = "та, тра-та-та, мы везём с собой кота"

val result = string.removeSurrounding(
    "та" // delimiter
)

textView.text = result // , тра-та-та, мы везём с собой ко

// Также можно указать разные начало и конец, которые окружают строку
val string = "Тра-та-та, тра-та-та, мы везём с собой кота"

val result = string.removeSurrounding(
    "Тра-", // prefix
    " кота" // suffix
)

textView.text = result // та-та, тра-та-та, мы везём с собой


// Добавляем отступы при явном переводе на новую строку
val string = "Какой-то длинный текст, \nсостоящий из имён котов: " +
        "\nВаська" +
        "\nБарсик" +
        "\nРыжик"

val result = string.prependIndent(
    "     " // indent
)

// Разбиваем символы на две группы. 
// В первую группу попадут символы в верхнем регистре, во вторую - символы в нижнем регистре
val string = "Кот Васька и кот Мурзик - Друзья!"

val result: Pair<String, String> = string.partition {
    it.isUpperCase()
}

textView.text = result.first + ":" + result.second //КВМД:от аська и кот урзик - рузья!

// Разбиваем строку на список строк. В качестве разделителя - перевод на новую строку
val string = "Кот Васька\nКотМурзик\nКот Мурзик"

// Split string into lines (CRLF, LF or CR)
val lines: List<String> = string.lines()

textView.text = "Кол-во строк: ${lines.size}"
lines.forEach {
    textView.append("\n" + it)
}

// Разбиваем строку на список строк с указанным числом символов. В последней строке может выводиться остаток
val string = "Тра-та-та, тра-та-та, мы везём с собой кота"
val list:List<String> = string.chunked(11)
list.forEach {
    textView.append("$it\n")
}

/*
Тра-та-та, 
тра-та-та, 
мы везём с 
собой кота
*/

// Содержит ли строка только цифры (используем предикат)
val string = "09032020"

// Returns true if all characters match the given predicate.
val result: Boolean = string.all{
    it.isDigit()
}
textView.append("Is the string $string contain only digit? $result")

// Содержит ли строка хотя бы одну цифру (используем предикат)
val string = "3 кота"
// Returns true if at least one character matches the given predicate.
val result: Boolean = string.any() {
    it.isDigit()
}
textView.append("Is the text \"$string\" contain any digit? $result")

// Сравниваем две строки с учётом регистра
val string1 = "This is a sample string."
val string2 = "This is a SAMPLE string."

if (string1.compareTo(string2, ignoreCase = true) == 0) {
    textView.append("\n\nBoth strings are equal, ignoring case.")
} else {
    textView.append("\n\nBoth strings are not equal, ignoring case.")
}

Можно фильтровать данные с помощью filter(). Допустим, мы хотим извлечь только цифры из строки.


val string = "9 жизней (2016) - Nine Lives - информация о фильме"
val filteredText = string.filter { it.isDigit() }
textView.text = filteredText // 92016

Если хочется решить обратную задачу и получить только символы, но не цифры - то достаточно вызвать filterNot().


val filteredText = string.filterNot { it.isDigit() }

String -> Hex String

fun ByteArray.toHexString() = joinToString("") { "%02x".format(it) }

var someString = "test"
val result = someString.toByteArray().toHexString()

Циклы, ветвления, групповые операции

// Использование циклов
for (arg in args)
    print(arg)

for (i in args.indices)
    print(args[i])

var i = 0
while (i < args.size) {
    print(args[i++])
}

// Использование switch (здесь он when называется)
when (test) {
    1 -> print("123")
    "Hello" -> print("jvcbsdjfv")
    is Long -> print("sjkdvnksdv")
    !is String -> print("sdfsdg")
    else -> print("Unknown")
}

// Использование интервалов
if (i in 1..5)
    print("OK")
if (i !in 1..5)
    print("FAIL")
for (i in 1..5 step 1)
    print(i)
    
// триарные операторы
fun max(a: Int, b: Int) = if (a > b) a else b

// return с оператором when
val color = "sfgsdg"
var test = when (color) {
    "Red" -> 0
    "Green" -> 1
    "Blue" -> 2
    else -> throw IllegalArgumentException("Invalid color param value")
}

// try/catch
val result = try {
    print("lkdfjvlkdfjvlkdfg")
} catch (e: ArithmeticException) {
    throw IllegalStateException(e)
}

// Вызов нескольких объектов через with
/*
class Turtle {
    fun penDown()
    fun penUp()
    fun turn(degrees: Double)
    fun forward(pixels: Double)
}

val myTurtle = Turtle()
with(myTurtle) { //draw a 100 pix square
    penDown()
    for(i in 1..4) {
        forward(100.0)
        turn(90.0)
    }
    penUp()
}
*/

Nullable

1. Elvis operator "?:" - вернет значение или сделает действие (return)
test = value ?: return

2. Use safee call - выполнится если не null
left?.let { node -> queue.add(node) }
left?.let { queue.add(it) }
left?.let(queue::add)

3. 
// Nullable-значения и проверка на null
fun var_null_and_check(str: Any): Int? {
    // Возвращает null если str не содержит числа
    // Ссылка должна быть явно объявлена как nullable (символ ?) когда она может принимать значение null.
    val x = null
    if (str is String || str == null)
        return 1
        //return str.length
    else {
        if (str !is String)
            return 1
        return 0
    }
}

// Сокращение для "Если не null"
val files = File("Test").listFiles()
println(files?.size)

// Сокращение для "Если не null, иначе"
println(files?.size ?: "empty")

// Вызов оператора при равенстве null
/*
val email = name["email"] ?: throw IllegalStateException("Email is missing!")
*/

// Выполнение при неравенстве
/*
val data = ...

data?.let {
    ... // execute this block if not null
}
*/

Коллекции

fun collections() {
        val items = setOf("apple", "banana", "kiwi")
        // Использование лямбда-выражения для фильтрации и модификации коллекции
        items
            .filter { it.startsWith("A") }
            .sortedBy { it }
            .map { it.toUpperCase() }
            .forEach { print(it) }

        // Read-only ассоциативный список (map)
        var map = mapOf("a" to 1, "b" to 2, "c" to 3)

        // Итерация по карте/списку пар
        for ((k, v) in map) {
            println("$k -> $v")
        }

        // Обращение к списку
        println(map["key"])

        // read-only list
        val list = listOf("a", "b", "c")
    }

Ленивые свойства

Будут вычислены при обращении

// Ленивые свойства
val p: String by lazy {
    // compute the string
    return@lazy "sdfsdf"
}

Синглтон

// Создание синглтона
/*
object Resource {
    val name = "Name"
}
*/

Reflection

Получить Type или Class

val type = object : TypeToken<MyErrorData>(){}.type
val klass = MyErrorData::class
где-то еще такое видел:
val klass = MyErrorData::class.java
val klass = MyErrorData.class

Создавать sealed классы:

https://kotlinlang.org/docs/reference/exceptions.html
https://kotlinlang.org/docs/reference/sealed-classes.html