// ---------- Extension-функции для String ----------
// Проверяет, есть ли в строке '@' и '.' после '@'
fun String.isValidEmail(): Boolean {
val at = indexOf('@') // позиция символа '@', если нет – вернёт -1
if (at < 0) return false // если '@' нет – сразу false
val dot = indexOf('.', at) // ищем '.' начиная с позиции at
// Проверяем, что точка есть, она после '@' и не последняя
if (dot <= at || dot >= length - 1) return false
return true
}
// Маскирует пароль: оставляет первый и последний символы, остальные заменяет на '*'
fun String.maskPassword(): String {
if (length <= 2) { // если длина 1 или 2, то просто звёздочки
var stars = ""
for (i in 1..length) stars += "*"
return stars
}
val first = get(0) // первый символ
val last = get(length - 1) // последний
var middle = ""
for (i in 1..length - 2) middle += "*" // добавляем нужное количество звёзд
return "$first$middle$last" // собираем строку
}
// Считает количество слов в строке (разбивает по пробелам и отбрасывает пустые)
fun String.wordCount(): Int {
val parts = split(" ") // разбиваем строку по пробелам
var count = 0
for (part in parts) {
if (part.isNotEmpty()) count++ // если часть не пустая – это слово
}
return count
}
// ---------- Extension-функции для Int ----------
// Проверяет, чётное ли число
fun Int.isEven(): Boolean = this % 2 == 0
// Переводит часы в минуты (умножает на 60)
fun Int.hoursToMinutes(): Int = this * 60
// infix-функция: выполняет переданное действие указанное количество раз
infix fun Int.timesRepeat(action: () -> Unit) {
var i = 1
while (i <= this) {
action() // выполняем действие
i++
}
}
// ---------- Extension-функции для List<T> ----------
// Возвращает второй элемент списка, или null, если его нет
fun <T> List<T>.secondOrNull(): T? {
if (size >= 2) return this[1]
else return null
}
// Возвращает третий элемент, или null
fun <T> List<T>.thirdOrNull(): T? {
if (size >= 3) return this[2]
else return null
}
fun main() {
// Тестируем String-расширения
println("test@mail.ru -> " + "test@mail.ru".isValidEmail()) // true
println("testmail.ru -> " + "testmail.ru".isValidEmail()) // false
println("secret123 -> " + "secret123".maskPassword()) // s*******3
println("ab -> " + "ab".maskPassword()) // **
println("Hello world Kotlin слов: " + "Hello world Kotlin".wordCount()) // 3
// Тестируем Int-расширения
println("4 чётное? " + 4.isEven()) // true
println("7 чётное? " + 7.isEven()) // false
println("2 часа в минутах: " + 2.hoursToMinutes()) // 120
println("5 часов в минутах: " + 5.hoursToMinutes()) // 300
// infix-функция: "3 timesRepeat { ... }" означает выполнить блок 3 раза
3 timesRepeat { println("Привет!") }
// Тестируем List-расширения
val list = listOf(10, 20, 30, 40)
println("Второй элемент: " + list.secondOrNull()) // 20
println("Третий элемент: " + list.thirdOrNull()) // 30
val empty = listOf<Int>()
println("Второй у пустого: " + empty.secondOrNull()) // null
}