#вакансия #job #vacancy #remote #parttime #преподаватель #educator #QA #Kotlin
Время делиться знаниями!
Компания: OTUS – образовательная платформа. За более чем 6 лет работы мы создали более 170 авторских курсов для IT-специалистов разного уровня от Junior до Senior. Практически на каждом нашем курсе есть вступительное тестирование для наших студентов, плюс более 650 преподавателей-практиков из крупнейших компаний. Мы учимся друг у друга, советуемся, помогаем, делимся опытом и обсуждаем новости как в преподавании, так и в IT.
Вакансия: преподаватель онлайн-курса «Kotlin QA Engineer» (интересные темы по программе курса и нагрузку можно выбирать).
Эта вакансия будет интересна разработчикам и инженерам по тестированию на Kotlin c практическим опытом в разработке на Kotlin от 1 года. Можно без опыта преподавания. Мы с удовольствием поможем Вам освоить Best Practices преподавания: для этого у нас есть вводный курс по преподаванию и пробные уроки с методистом.
Преподаватель раскрывает тему урока с помощью теории и примеров из практики.
Условия:
✅ удаленное сотрудничество, занятость part-time.
✅стандартное занятие длится 1,5 часа с 20:00 до 21:30 по МСК.
✅ уроки проводятся в онлайн формате в Zoom.
✅ на занятиях используется презентация с теорией и практические примеры, чтобы раскрыть тему урока.
✅ наши методисты помогают освоить лучшие инструменты и практики преподавания.
Еще Вы сможете:
✅ внести свой вклад в развитие IT
✅ структурировать свой опыт и знания.
✅ развивать личный бренд.
✅ прокачать софт-скиллы.
✅ получать от 4000 до 6000 руб. за один вебинар (полтора часа) + отдельно оплачивается проверка ДЗ и другие активности, в которых можно по желанию участвовать.
Бонусы:
✅ наши курсы со скидкой/бесплатно.
✅ возможность приглашать в свою команду на работу лучших выпускников.
✅ воркшопы и конференции для наших преподавателей.
Подробнее в telegram: @ElenaAlias
Время делиться знаниями!
Компания: OTUS – образовательная платформа. За более чем 6 лет работы мы создали более 170 авторских курсов для IT-специалистов разного уровня от Junior до Senior. Практически на каждом нашем курсе есть вступительное тестирование для наших студентов, плюс более 650 преподавателей-практиков из крупнейших компаний. Мы учимся друг у друга, советуемся, помогаем, делимся опытом и обсуждаем новости как в преподавании, так и в IT.
Вакансия: преподаватель онлайн-курса «Kotlin QA Engineer» (интересные темы по программе курса и нагрузку можно выбирать).
Эта вакансия будет интересна разработчикам и инженерам по тестированию на Kotlin c практическим опытом в разработке на Kotlin от 1 года. Можно без опыта преподавания. Мы с удовольствием поможем Вам освоить Best Practices преподавания: для этого у нас есть вводный курс по преподаванию и пробные уроки с методистом.
Преподаватель раскрывает тему урока с помощью теории и примеров из практики.
Условия:
✅ удаленное сотрудничество, занятость part-time.
✅стандартное занятие длится 1,5 часа с 20:00 до 21:30 по МСК.
✅ уроки проводятся в онлайн формате в Zoom.
✅ на занятиях используется презентация с теорией и практические примеры, чтобы раскрыть тему урока.
✅ наши методисты помогают освоить лучшие инструменты и практики преподавания.
Еще Вы сможете:
✅ внести свой вклад в развитие IT
✅ структурировать свой опыт и знания.
✅ развивать личный бренд.
✅ прокачать софт-скиллы.
✅ получать от 4000 до 6000 руб. за один вебинар (полтора часа) + отдельно оплачивается проверка ДЗ и другие активности, в которых можно по желанию участвовать.
Бонусы:
✅ наши курсы со скидкой/бесплатно.
✅ возможность приглашать в свою команду на работу лучших выпускников.
✅ воркшопы и конференции для наших преподавателей.
Подробнее в telegram: @ElenaAlias
Otus
О компании OTUS
Наша миссия — делать обучение осмысленным, реализуя взаимосвязь между ожиданиями работодателей, компетенциями специалистов и возможностями преподавателей
Какие коллекции есть в Kotlin?
Коллекция — это объект, содержащий в себе набор значений одного или различных типов, а также позволяющий к этим значениям обращаться и извлекать. Другими словами — это контейнер, в который вы можете помещать то, что вам нужно, а затем каким-либо образом с ним взаимодействовать. В Kotlin есть три типа коллекций:
• List (список). Упорядоченная коллекция, в которой к элементам можно обращаться по их индексам. Идентичные элементы (дубликаты) могут встречаться в списке более одного раза. Примером списка является предложение: это группа слов, их порядок важен, и они могут повторяться.
• Set (множество/набор). Неупорядоченная коллекция без повторяющихся значений. Примером множества является алфавит.
• Map (словарь/ассоциативный список). Набор из пар "ключ-значение". Ключи уникальны и каждый из них соответствует ровно одному значению. В коллекции могут присутствовать повторяющиеся значения, но не повторяющиеся ключи. Пример — ID сотрудников и их должностей. Map не является наследником интерфейса Collection.
Два типа интерфейсов, на основе которых создаются коллекции:
1. Неизменяемый (read-only) — дают доступ только для чтения (Set, List, Map, Collection).
2. Изменяемый (mutable) — расширяет предыдущий интерфейс и дополнительно даёт доступ к операциям добавления, удаления и обновления элементов коллекции (
Коллекция — это объект, содержащий в себе набор значений одного или различных типов, а также позволяющий к этим значениям обращаться и извлекать. Другими словами — это контейнер, в который вы можете помещать то, что вам нужно, а затем каким-либо образом с ним взаимодействовать. В Kotlin есть три типа коллекций:
• List (список). Упорядоченная коллекция, в которой к элементам можно обращаться по их индексам. Идентичные элементы (дубликаты) могут встречаться в списке более одного раза. Примером списка является предложение: это группа слов, их порядок важен, и они могут повторяться.
• Set (множество/набор). Неупорядоченная коллекция без повторяющихся значений. Примером множества является алфавит.
• Map (словарь/ассоциативный список). Набор из пар "ключ-значение". Ключи уникальны и каждый из них соответствует ровно одному значению. В коллекции могут присутствовать повторяющиеся значения, но не повторяющиеся ключи. Пример — ID сотрудников и их должностей. Map не является наследником интерфейса Collection.
Два типа интерфейсов, на основе которых создаются коллекции:
1. Неизменяемый (read-only) — дают доступ только для чтения (Set, List, Map, Collection).
2. Изменяемый (mutable) — расширяет предыдущий интерфейс и дополнительно даёт доступ к операциям добавления, удаления и обновления элементов коллекции (
MutableSet
, MutableList
, MutableMap
, MutableCollection
).Все, что вам нужно знать о Kotlin Multiplatform
Kotlin Multiplatform — это набор для разработки программного обеспечения, который значительно лучше других вариантов разработки кроссплатформенных приложений. В этом руководстве по Kotlin multiplatform вы подробно узнаете все об этом наборе.
Читать статью
Kotlin Multiplatform — это набор для разработки программного обеспечения, который значительно лучше других вариантов разработки кроссплатформенных приложений. В этом руководстве по Kotlin multiplatform вы подробно узнаете все об этом наборе.
Читать статью
Teletype
Все, что вам нужно знать о Kotlin Multiplatform
Kotlin Multiplatform — это набор для разработки программного обеспечения, который значительно лучше других вариантов разработки...
Стань частью Android-комьюнити Surf
В канале Surf Android Team разработчики приложений «Лабиринт», «Магнит», «Ригла» и других делятся лучшими практиками и больными шишками из опыта работы с Kotlin, Java и нейросетями.
Вот подборка полезных постов из канала:
➡️ Как сделать Lottie-анимации
➡️ Дорожная карта Junior Android-разработчика
➡️ Как реализовать автовставку кода из SMS через SMS User Consent API
Surf активно расширяет Android-комьюнити и ждёт вас в канале, чтобы делиться интересными кейсами и быть на одной волне актуальных технологий.
🟢 Подписывайтесь по ссылке → @surf_android
В канале Surf Android Team разработчики приложений «Лабиринт», «Магнит», «Ригла» и других делятся лучшими практиками и больными шишками из опыта работы с Kotlin, Java и нейросетями.
Вот подборка полезных постов из канала:
Surf активно расширяет Android-комьюнити и ждёт вас в канале, чтобы делиться интересными кейсами и быть на одной волне актуальных технологий.
Please open Telegram to view this post
VIEW IN TELEGRAM
Промежуточные (intermediate) и терминальные (terminal) операции в Sequences
Sequence представляет собой последовательность элементов, которые можно обрабатывать по одному или несколько штук сразу. Обработка элементов Sequence происходит с помощью функций высшего порядка, которые называются операциями.
Операции над Sequence можно разделить на две категории: промежуточные (intermediate) и терминальные (terminal).
Промежуточные операции (intermediate) — это операции, которые возвращают новую Sequence.
Они не выполняются немедленно, а лишь формируют новую последовательность элементов на основе исходной. Промежуточные операции не приводят к запуску вычислений, а готовят данные для последующих операций. Примеры:
filter(predicate: (T) -> Boolean): фильтрует элементы по заданному условию и возвращает новую Sequence
map(transform: (T) -> R): преобразует каждый элемент в новый элемент типа R и возвращает новую Sequence
sortedBy(selector: (T) -> R?): сортирует элементы по заданному ключу и возвращает новую Sequence
Терминальные операции (terminal) — это операции, которые выполняются немедленно и возвращают результат (не Sequence).
Терминальные операции могут быть вызваны только после всех промежуточных операций, так как они завершают последовательность и начинают вычисление результатов на основе всей последовательности, полученной после выполнения всех промежуточных операций. Если же терминальная операция вызывается до выполнения всех промежуточных операций, то она не будет иметь доступа к полной последовательности и вернет неполный результат. Примеры:
toList(): преобразует Sequence в список
toSet(): преобразует Sequence в множество
count(): возвращает количество элементов в Sequence
forEach(action: (T) -> Unit): выполняет действие для каждого элемента Sequence
ВАЖНО: вычисления запускаются только при вызове терминальной функции (до этого момента никаких вычислений не производится).
Sequence представляет собой последовательность элементов, которые можно обрабатывать по одному или несколько штук сразу. Обработка элементов Sequence происходит с помощью функций высшего порядка, которые называются операциями.
Операции над Sequence можно разделить на две категории: промежуточные (intermediate) и терминальные (terminal).
Промежуточные операции (intermediate) — это операции, которые возвращают новую Sequence.
Они не выполняются немедленно, а лишь формируют новую последовательность элементов на основе исходной. Промежуточные операции не приводят к запуску вычислений, а готовят данные для последующих операций. Примеры:
filter(predicate: (T) -> Boolean): фильтрует элементы по заданному условию и возвращает новую Sequence
map(transform: (T) -> R): преобразует каждый элемент в новый элемент типа R и возвращает новую Sequence
sortedBy(selector: (T) -> R?): сортирует элементы по заданному ключу и возвращает новую Sequence
Терминальные операции (terminal) — это операции, которые выполняются немедленно и возвращают результат (не Sequence).
Терминальные операции могут быть вызваны только после всех промежуточных операций, так как они завершают последовательность и начинают вычисление результатов на основе всей последовательности, полученной после выполнения всех промежуточных операций. Если же терминальная операция вызывается до выполнения всех промежуточных операций, то она не будет иметь доступа к полной последовательности и вернет неполный результат. Примеры:
toList(): преобразует Sequence в список
toSet(): преобразует Sequence в множество
count(): возвращает количество элементов в Sequence
forEach(action: (T) -> Unit): выполняет действие для каждого элемента Sequence
ВАЖНО: вычисления запускаются только при вызове терминальной функции (до этого момента никаких вычислений не производится).
Kotlin: взгляд изнутри — преимущества, недостатки и особенности
Всем привет! На связи Сергей Керенцев, Android-разработчик Студии Олега Чулакова на проектах Сбера.
В данной статье мы углубимся в мир Kotlin, рассмотрим его основные преимущества, недостатки и особенности. Мы обойдем такие важные аспекты, как безопасность работы с null-значениями, гибкость типизации с помощью Generics, возможности расширения функциональности с помощью extension-функций, inline-функции, а также многое другое.
Давайте начнем наше увлекательное путешествие в мир Kotlin и раскроем его потенциал!
Читать статью
Всем привет! На связи Сергей Керенцев, Android-разработчик Студии Олега Чулакова на проектах Сбера.
В данной статье мы углубимся в мир Kotlin, рассмотрим его основные преимущества, недостатки и особенности. Мы обойдем такие важные аспекты, как безопасность работы с null-значениями, гибкость типизации с помощью Generics, возможности расширения функциональности с помощью extension-функций, inline-функции, а также многое другое.
Давайте начнем наше увлекательное путешествие в мир Kotlin и раскроем его потенциал!
Читать статью
Teletype
Kotlin: взгляд изнутри — преимущества, недостатки и особенности
Всем привет! На связи Сергей, Android-разработчик Студии Олега Чулакова на проектах Сбера.
Kotlin Multiplatform в ОС Аврора
В данной статье описана работа ОС Аврора с технологией Kotlin Multiplatform. Рассматривается метод подключения модуля Kotlin Multiplatform к приложению на Qt/QML. Для демонстрации было портировано уже существующие демо приложение "KMM RSS Reader". Проведены тесты производительности.
Читать статью
В данной статье описана работа ОС Аврора с технологией Kotlin Multiplatform. Рассматривается метод подключения модуля Kotlin Multiplatform к приложению на Qt/QML. Для демонстрации было портировано уже существующие демо приложение "KMM RSS Reader". Проведены тесты производительности.
Читать статью
Teletype
Kotlin Multiplatform в ОС Аврора
Kotlin Multiplatform — технология, позволяющая объединять бизнес-логику для приложений разных платформ. В ней доступен полный контроль...
Что такое функциональный тип, какие у него ограничения?
Язык Kotlin допускает объявлять тип анонимных функций или лямбда выражений — функциональный.
Функциональный тип — это тип данных, который позволяет работать с функциями как с обычными объектами, передавать функции в качестве аргументов и возвращать их из функций. Синтаксис функционального типа в Котлин представлен списком типов параметров, разделенных запятой, затем оператором -> и типом возвращаемого значения функции.
Пример функционального типа: (a: Int, b: Int) -> Int
Здесь функциональный тип описывает функцию с двумя параметрами типа Int и возвращаемым значением типа Int.
Функциональный тип может быть использован для создания переменных, которые могут хранить ссылки на функции. А также поддерживает перегрузку, что позволяет иметь несколько функций с различными сигнатурами, но с одинаковым именем.
Ограничения функционального типа:
• Тип передаваемой функции должен быть определен явно, чтобы компилятор мог проверить типы аргументов и возвращаемых значений.
• Функциональный тип может содержать только один тип возвращаемого значения.
• Функциональный тип не может содержать более 22 параметров из-за ограничения JVM.
• Функциональный тип не поддерживает неявные преобразования типов.
Несмотря на эти ограничения, функциональные типы позволяют обрабатывать функции как объекты, что повышает гибкость и выразительность кода. Пример определения функционального типа:
Язык Kotlin допускает объявлять тип анонимных функций или лямбда выражений — функциональный.
Функциональный тип — это тип данных, который позволяет работать с функциями как с обычными объектами, передавать функции в качестве аргументов и возвращать их из функций. Синтаксис функционального типа в Котлин представлен списком типов параметров, разделенных запятой, затем оператором -> и типом возвращаемого значения функции.
Пример функционального типа: (a: Int, b: Int) -> Int
Здесь функциональный тип описывает функцию с двумя параметрами типа Int и возвращаемым значением типа Int.
Функциональный тип может быть использован для создания переменных, которые могут хранить ссылки на функции. А также поддерживает перегрузку, что позволяет иметь несколько функций с различными сигнатурами, но с одинаковым именем.
Ограничения функционального типа:
• Тип передаваемой функции должен быть определен явно, чтобы компилятор мог проверить типы аргументов и возвращаемых значений.
• Функциональный тип может содержать только один тип возвращаемого значения.
• Функциональный тип не может содержать более 22 параметров из-за ограничения JVM.
• Функциональный тип не поддерживает неявные преобразования типов.
Несмотря на эти ограничения, функциональные типы позволяют обрабатывать функции как объекты, что повышает гибкость и выразительность кода. Пример определения функционального типа:
// определение функционального типаКод из примера определяет функциональный тип Operation, который представляет собой функцию, принимающую два аргумента типа Int и возвращающую значение типа Int. Затем создается функция calculate, которая принимает три параметра: функцию op типа Operation и два аргумента типа Int. Внутри функции calculate вызывается переданная функция op с переданными аргументами a и b, и результат возвращается из функции calculate. В конце кода создается переменная sum, которая содержит лямбда-выражение, реализующее операцию сложения. Далее вызывается функция calculate с параметрами sum, 10 и 5, что приводит к вызову функции sum с аргументами 10 и 5, и результатом является число 15.
typealias Operation = (Int, Int) -> Int
// использование функционального типа
fun calculate(op: Operation, a: Int, b: Int): Int {
return op(a, b)
}
// пример вызова функции calculate
val sum: Operation = { x, y -> x + y }
calculate(sum, 10, 5) // результат: 15
✅ Какие навыки необходимы для эффективного тестирования на Kotlin?
Получите их на бесплатном открытом уроке «Использование KSP2 для тестирования на Kotlin» в рамках курса «Kotlin QA Engineer» от OTUS
🔹На вебинаре мы погрузимся в мир новой версии Kotlin Symbol Processing - KSP2. Рассмотрим принципы анализа исходных текстов и кодогенерации на KSP (PSI-дерево) и обсудим возможности ее применения для генерации тестовых данных и сценариев.
👉 Регистрация
https://otus.pw/7Pwn/?erid=LjN8KHUvr
Получите их на бесплатном открытом уроке «Использование KSP2 для тестирования на Kotlin» в рамках курса «Kotlin QA Engineer» от OTUS
🔹На вебинаре мы погрузимся в мир новой версии Kotlin Symbol Processing - KSP2. Рассмотрим принципы анализа исходных текстов и кодогенерации на KSP (PSI-дерево) и обсудим возможности ее применения для генерации тестовых данных и сценариев.
👉 Регистрация
https://otus.pw/7Pwn/?erid=LjN8KHUvr
Как работают SAM-conversions?
Single Abstract Method (SAM) интерфейсы — это интерфейсы только с одним абстрактным методом (функциональные интерфейсы). Kotlin поддерживает соглашение SAM — автоматическую конвертацию функций и lambda между Kotlin и Java.
SAM-conversions позволяют использовать Java-интерфейсы с единственным абстрактным методом в Kotlin, как если бы это были функциональные типы. В Kotlin вы можете использовать такие интерфейсы для создания лямбда-выражений без явного определения функционального типа.
При использовании интерфейса с единственным абстрактным методом в качестве функционального интерфейса в Java, вы можете передавать его экземпляры вместо лямбда-выражений. Это тоже возможно в Kotlin, но на самом деле Kotlin предоставляет более простой синтаксис для этого. Когда вам нужно использовать функциональный интерфейс в Kotlin, вы можете передать lambda-выражение, которое соответствует сигнатуре единственного метода интерфейса, вместо экземпляра интерфейса. Компилятор сам преобразует лямбда-выражение в экземпляр интерфейса, используя функцию-расширение метода invoke интерфейса. Пример:
Single Abstract Method (SAM) интерфейсы — это интерфейсы только с одним абстрактным методом (функциональные интерфейсы). Kotlin поддерживает соглашение SAM — автоматическую конвертацию функций и lambda между Kotlin и Java.
SAM-conversions позволяют использовать Java-интерфейсы с единственным абстрактным методом в Kotlin, как если бы это были функциональные типы. В Kotlin вы можете использовать такие интерфейсы для создания лямбда-выражений без явного определения функционального типа.
При использовании интерфейса с единственным абстрактным методом в качестве функционального интерфейса в Java, вы можете передавать его экземпляры вместо лямбда-выражений. Это тоже возможно в Kotlin, но на самом деле Kotlin предоставляет более простой синтаксис для этого. Когда вам нужно использовать функциональный интерфейс в Kotlin, вы можете передать lambda-выражение, которое соответствует сигнатуре единственного метода интерфейса, вместо экземпляра интерфейса. Компилятор сам преобразует лямбда-выражение в экземпляр интерфейса, используя функцию-расширение метода invoke интерфейса. Пример:
interface OnClickListener {В этом примере мы определяем интерфейс OnClickListener с единственным абстрактным методом onClick. Затем мы создаем класс Button, который может иметь слушатель, реализующий данный интерфейс. После этого мы создаем экземпляр Button и передаем лямбда-выражение с соответствующей сигнатурой в качестве слушателя. Компилятор автоматически преобразует это лямбда-выражение в экземпляр интерфейса OnClickListener, используя функцию-расширение invoke интерфейса.
fun onClick(view: View)
}
class Button {
fun setOnClickListener(listener: OnClickListener) {
// ...
}
}
val button = Button()
button.setOnClickListener { view ->
// обработка нажатия кнопки
}
This media is not supported in your browser
VIEW IN TELEGRAM
🔥 Пройди тест по Kotlin QA и проверь свои знания.
Ответишь — пройдешь на продвинутый курс «Kotlin QA Engineer» от OTUS по специальной цене + получишь доступ к записям открытых уроков курса курса
👉 ПРОЙТИ ТЕСТ:
https://clck.ru/3ABEtm?erid=LjN8JvK8k
Ответишь — пройдешь на продвинутый курс «Kotlin QA Engineer» от OTUS по специальной цене + получишь доступ к записям открытых уроков курса курса
👉 ПРОЙТИ ТЕСТ:
https://clck.ru/3ABEtm?erid=LjN8JvK8k
Koin: Простой и легковесный фреймворк для внедрения зависимостей
Принцип внедрения зависимостей становится все более неотъемлемой частью процесса разработки. Без него сложно представить себе достижение желанного разделения обязанностей в коде или обеспечение должного уровня тестируемости.
В то же время, хотя Spring Framework и является широко распространенным выбором, он далеко не всем подходит. Некоторым было бы предпочтительнее использовать более простые и легковесные фреймворки с продвинутой поддержкой асинхронных операций ввода-вывода. Другие были бы признательны за статическое разрешение зависимостей для более быстрого запуска приложения.
Читать статью
Принцип внедрения зависимостей становится все более неотъемлемой частью процесса разработки. Без него сложно представить себе достижение желанного разделения обязанностей в коде или обеспечение должного уровня тестируемости.
В то же время, хотя Spring Framework и является широко распространенным выбором, он далеко не всем подходит. Некоторым было бы предпочтительнее использовать более простые и легковесные фреймворки с продвинутой поддержкой асинхронных операций ввода-вывода. Другие были бы признательны за статическое разрешение зависимостей для более быстрого запуска приложения.
Читать статью
Teletype
Koin: Простой и легковесный фреймворк для внедрения зависимостей
Принцип внедрения (инжектирования) зависимостей становится все более неотъемлемой частью процесса разработки. Без него сложно...
🚀 Подключайся к Usetech Mobile MeetUp (UMM) #1
Не попал на весенние конференции по мобильной разработке или не удалось задать вопросы экспертам? 6 мая в 15:00 по Мск присоединяйся к первому онлайн-митапу по мобильной разработке от ГК Юзтех.
🔥 В программе:
🔊«SwiftUI сейчас. Стек, советы, рекомендации» Анна Жаркова, лид мобильной разработки в ГК Юзтех
🔊 «НЕмультиплатформенные привычки Android разработки» Алексей Панов, техлид инфраструктуры мобильных приложений в Контур
🔊 «Пять лет с Flutter: эволюция кроссплатформенности» Евгений Сатуров, руководитель команды Flutter-разработки в SURF
Регистрируйся на митап по ссылке.
🤩 Авторы самых интересных вопросов получат фирменных юзтех-уточек в подарок!
Реклама. ООО "ЮЗТЕХ ПРОФЕШНЛ". ИНН 7717745183.
Не попал на весенние конференции по мобильной разработке или не удалось задать вопросы экспертам? 6 мая в 15:00 по Мск присоединяйся к первому онлайн-митапу по мобильной разработке от ГК Юзтех.
🔥 В программе:
🔊«SwiftUI сейчас. Стек, советы, рекомендации» Анна Жаркова, лид мобильной разработки в ГК Юзтех
🔊 «НЕмультиплатформенные привычки Android разработки» Алексей Панов, техлид инфраструктуры мобильных приложений в Контур
🔊 «Пять лет с Flutter: эволюция кроссплатформенности» Евгений Сатуров, руководитель команды Flutter-разработки в SURF
Регистрируйся на митап по ссылке.
🤩 Авторы самых интересных вопросов получат фирменных юзтех-уточек в подарок!
Реклама. ООО "ЮЗТЕХ ПРОФЕШНЛ". ИНН 7717745183.
Указатели на функции (Function references, Bound callable references)
В языке Kotlin есть возможность работать с функциями как с объектами. Функции можно сохранять в переменные, передавать как аргументы и возвращать из других функций. Для этого можно использовать функциональные ссылки (Function references), которые представляют собой указатель на функцию.
1. Function references
Синтаксис функциональной ссылки имеет следующий вид:
Bound callable references (привязанные ссылки) — это то же самое понятие, что и указатели на методы, но в случае, когда метод вызывается на экземпляре класса. В этом варианте мы можем использовать ссылку на метод, связанную с конкретным экземпляром класса. Для создания привязанной ссылки на метод используется следующий синтаксис: <object_name>::<method_name>.
Допустим, что у нас есть экземпляр класса person типа Person. Тогда мы можем использовать ссылку на метод getName() для получения его имени:
В языке Kotlin есть возможность работать с функциями как с объектами. Функции можно сохранять в переменные, передавать как аргументы и возвращать из других функций. Для этого можно использовать функциональные ссылки (Function references), которые представляют собой указатель на функцию.
1. Function references
Синтаксис функциональной ссылки имеет следующий вид:
::function_name
. Указатели на функции представляют собой сокращенную форму записи вызова функции. Вместо того, чтобы объявлять лямбда-выражение и передавать его как аргумент функции, можно использовать ссылку на существующий метод. Например, у нас есть класс Person с методом getName():class Person(val name: String) {Тогда мы можем использовать указатель на метод getName() вместо лямбда-выражения:
fun getName(): String = name
}
val persons = listOf(Person("Alice"), Person("Bob"))2. Bound callable references
val names = persons.map(Person::getName)
Bound callable references (привязанные ссылки) — это то же самое понятие, что и указатели на методы, но в случае, когда метод вызывается на экземпляре класса. В этом варианте мы можем использовать ссылку на метод, связанную с конкретным экземпляром класса. Для создания привязанной ссылки на метод используется следующий синтаксис: <object_name>::<method_name>.
Допустим, что у нас есть экземпляр класса person типа Person. Тогда мы можем использовать ссылку на метод getName() для получения его имени:
val person = Person("Alice")Здесь name будет ссылаться на метод getName() объекта person.
val name = person::getName
Вы, случайно, не мобильный разработчик? Тогда откуда для вас такой оффер?
18 и 19 мая пройдет Mobile Weekend Offer в Тинькофф. Для iOS- и Android-разработчиков с опытом от 3 лет.
Вот что будет:
— пройдете все этапы собеседования за выходные;
— познакомитесь с командой;
— если все хорошо, получите оффер на неделе. уже в воскресенье.
Дальше — будете решать масштабные финтех-задачи, развивать продукты для миллионов, пользоваться бенефитами и расти.
Оставьте заявку до 15 мая
Реклама. АО «Тинькофф Банк», ИНН 7710140679
18 и 19 мая пройдет Mobile Weekend Offer в Тинькофф. Для iOS- и Android-разработчиков с опытом от 3 лет.
Вот что будет:
— пройдете все этапы собеседования за выходные;
— познакомитесь с командой;
— если все хорошо, получите оффер на неделе. уже в воскресенье.
Дальше — будете решать масштабные финтех-задачи, развивать продукты для миллионов, пользоваться бенефитами и расти.
Оставьте заявку до 15 мая
Реклама. АО «Тинькофф Банк», ИНН 7710140679
Задачи про PEG-парсеры
Когда-то я хотел сделать контест по парсингу для Codeforces. Придумал задания двух типов:
1. Дается неформальное описание языка, по которому нужно создать грамматику (например, "язык с правильными скобочными последовательностями")
2. Даны примеры строк в языке, по которым нужно восстановить грамматику
У обоих типов заданий есть свои проблемы, так что контест я не сделал.
В итоге я сделал игру программу, в которой можно решать задания второго типа, при этом проверять строки на принадлежность угадываемому языку.
Читать статью
Когда-то я хотел сделать контест по парсингу для Codeforces. Придумал задания двух типов:
1. Дается неформальное описание языка, по которому нужно создать грамматику (например, "язык с правильными скобочными последовательностями")
2. Даны примеры строк в языке, по которым нужно восстановить грамматику
У обоих типов заданий есть свои проблемы, так что контест я не сделал.
В итоге я сделал игру программу, в которой можно решать задания второго типа, при этом проверять строки на принадлежность угадываемому языку.
Читать статью
Teletype
Задачи про PEG-парсеры
Когда-то я хотел сделать контест по парсингу для Codeforces. Придумал задания двух типов:
Что такое inline функции, в чем их преимущество?
В Kotlin есть два типа функций: обычные и встроенные. Обычные функции похожи на функции в других языках программирования. Но встроенные функции имеют модификатор inline. Это позволяет компилятору подставить тело функции прямо в место её вызова.
Как работают inline функции?
Использование анонимных функций (лямбда-выражений) в Kotlin приводит к дополнительным затратам памяти. При использовании лямбда-выражения создается объект FunctionN (где N — количество параметров в лямбда-выражении), который содержит ссылку на само лямбда-выражение и может содержать захваченные переменные. При передаче лямбда-выражения в качестве параметра метода также создается новый объект FunctionN, что приводит к дополнительным затратам памяти.
Поэтому, чтобы избежать создания дополнительных объектов при передаче лямбда-выражений в функцию в качестве параметра, можно использовать встраивание (inline). Ключевое слово inline позволяет компилятору подставить тело функции непосредственно в место её вызова, вместо того, чтобы создавать объекты функций. Таким образом можно уменьшить затраты на создание объектов и улучшить производительность приложения.
Пример синтаксиса inline-функций с лямбдой:
В Kotlin есть два типа функций: обычные и встроенные. Обычные функции похожи на функции в других языках программирования. Но встроенные функции имеют модификатор inline. Это позволяет компилятору подставить тело функции прямо в место её вызова.
Как работают inline функции?
Использование анонимных функций (лямбда-выражений) в Kotlin приводит к дополнительным затратам памяти. При использовании лямбда-выражения создается объект FunctionN (где N — количество параметров в лямбда-выражении), который содержит ссылку на само лямбда-выражение и может содержать захваченные переменные. При передаче лямбда-выражения в качестве параметра метода также создается новый объект FunctionN, что приводит к дополнительным затратам памяти.
Поэтому, чтобы избежать создания дополнительных объектов при передаче лямбда-выражений в функцию в качестве параметра, можно использовать встраивание (inline). Ключевое слово inline позволяет компилятору подставить тело функции непосредственно в место её вызова, вместо того, чтобы создавать объекты функций. Таким образом можно уменьшить затраты на создание объектов и улучшить производительность приложения.
Пример синтаксиса inline-функций с лямбдой:
inline fun functionName(parameter1: Type1, parameter2: Type2, ..., parameterN: TypeN, block: () -> Unit): ReturnType {Модификатор inline влияет и на функцию, и на лямбду, переданную ей: они обе будут встроены в место вызова.
// function body
}
⚡️ Тест на знание языка Kotlin⚡️
Ответьте на 10 вопросов и проверьте, насколько вы готовы к углубленному изучению Kotlin.
Сможете пройти успешно тест — пройдете на продвинутый онлайн-курс "Kotlin Backend Developer" от OTUS со скидкой.
➡️ ПРОЙТИ ТЕСТ — https://vk.cc/cwQAro
Курс доступен в рассрочку!
🎁 Для успешно прошедших тест, откроется доступ к открытым урокам курса + курс по Git в записи!
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
Ответьте на 10 вопросов и проверьте, насколько вы готовы к углубленному изучению Kotlin.
Сможете пройти успешно тест — пройдете на продвинутый онлайн-курс "Kotlin Backend Developer" от OTUS со скидкой.
Курс доступен в рассрочку!
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
Please open Telegram to view this post
VIEW IN TELEGRAM
Ускоряем поиск по коду в Android Studio
Рассмотрим возможности Android Studio, позволяющие быстрее ориентироваться в коде: находить нужные фрагменты и выявлять связи между ними.
Если вы опытный пользователь, то вам известно большинство нижеперечисленных лайфхаков. Но я узнавал о многих возможностях случайно, через многие месяцы работы в Android Studio, поэтому хочу рассказать всё, везде и сразу.
Читать статью
Рассмотрим возможности Android Studio, позволяющие быстрее ориентироваться в коде: находить нужные фрагменты и выявлять связи между ними.
Если вы опытный пользователь, то вам известно большинство нижеперечисленных лайфхаков. Но я узнавал о многих возможностях случайно, через многие месяцы работы в Android Studio, поэтому хочу рассказать всё, везде и сразу.
Читать статью
Teletype
Ускоряем поиск по коду в Android Studio
Рассмотрим возможности Android Studio, позволяющие быстрее ориентироваться в коде: находить нужные фрагменты и выявлять связи между ними.
Модификатор noinline
Если же вы хотите, чтобы некоторые лямбды, переданные inline-функции, не были встроены, то отметьте их модификатором noinline.
Если же вы хотите, чтобы некоторые лямбды, переданные inline-функции, не были встроены, то отметьте их модификатором noinline.
inline fun foo(inlined: () -> Unit, noinline notInlined: () -> Unit) {Разница между ними в том, что встраиваемая лямбда может быть вызвана только внутри inline-функции, либо может быть передана в качестве встраиваемого аргумента. В то время как с noinline-функциями можно работать без ограничений: хранить внутри полей, передавать куда-либо и т.д.
// ...
}
Создаем нативное Kotlin приложение на Spring Boot Native, Gradle и GraalVM без докера под MacOS и Windows
В этой статье я хочу рассказать о практическом опыте нативной компиляции production приложения, написанного на Kotlin со Spring Boot, Gradle с использованием GraalVM . Начну сразу с минусов и плюсов самой возможности нативной компиляции и где она может быть полезна, и дальше перейду уже непосредственно к процессу сборки под MacOS и Windows.
В конце статьи я более подробно расскажу о проекте и почему возникла такая необходимость, учитывая довольно много ограничений и подводных камней поддержки нативной компиляции как со стороны Spring Boot, та и со стороны GraalVM.
Читать статью
В этой статье я хочу рассказать о практическом опыте нативной компиляции production приложения, написанного на Kotlin со Spring Boot, Gradle с использованием GraalVM . Начну сразу с минусов и плюсов самой возможности нативной компиляции и где она может быть полезна, и дальше перейду уже непосредственно к процессу сборки под MacOS и Windows.
В конце статьи я более подробно расскажу о проекте и почему возникла такая необходимость, учитывая довольно много ограничений и подводных камней поддержки нативной компиляции как со стороны Spring Boot, та и со стороны GraalVM.
Читать статью
Teletype
Создаем нативное Kotlin приложение на Spring Boot Native, Gradle и GraalVM без докера под MacOS и Windows
В этой статье я хочу рассказать о практическом опыте нативной компиляции production приложения, написанного на Kotlin со Spring Boot...