February 8, 2021

Kotlin — примеры использования

Привет! Сегодня рассмотрим некоторые полезные примеры использования Kotlin - массивы, списки, корутины, дженерики и многое другое.

FizzBuzz на Kotlin

FizzBuzz - популярная задачка на собеседованиях для проверки базовых знаний языка и логического мышления.

По условию задачи нужно вывести числа от 1 до 100, и если число кратно 3 - вывести Fizz, если без остатка делится на 5 - Buzz, а если на 3 и на 5 - FizzBuzz.

fun fizzBuzzWhen(n: Int) = 
    when {        
        n % 15 == 0 -> "FizzBuzz"        
        n % 5 == 0 -> "Buzz"        
        n % 3 ==0 -> "Fizz"        
        else -> n    
    }

Тут используется оператор - when, который в зависимости от условия возвращает значение. Теперь проверим работу

(1..100).map {    
    println( fizzBuzzWhen(it) )
}

Все работает как надо!

Bufferedimage черно белое изображение

Тут мы просто используем класс ColorConvertOp и с помощью ColorSpace.CS_GRAY получаем черно белую картинку.

fun BufferedImage.desaturate(): BufferedImage {    
    val colorConvert = ColorConvertOp (
        ColorSpace.getInstance(ColorSpace.CS_GRAY), null
    )    
    return colorConvert.filter(this, this)
}

Функция написана в виде расширения для java BufferedImage

Как перевести hex в Color?

Простое свойство в виде лямбды, которое принимает на вход строку вида - dd7c2b, где dd7c2b - hex цвет, и возвращает стандартный java Color

val toRGB = { hex: String ->    
    val blue: Int = hex.toInt(16) and 0xff    
    val green: Int = hex.toInt(16) and 0xff00 shr 8    
    val red: Int = hex.toInt(16) and 0xff0000 shr 16    
    Color(red,green,blue)
}

Асинхронно загрузить и прочитать File coroutines Kotlin

Для асинхронной загрузки файлов нам потребуется подключить корутины, и воспользоваться билдером async await

suspend fun writeContentAsync(
    file: String, data: ByteArray, add: Boolean = false
) = 
coroutineScope {  
    val dataStr = async(Dispatchers.IO) {        
        FileOutputStream(file, add).write(data)    
    }    
    try {        
        dataStr.await()    
    } catch (ex: Exception) {        
        throw Exception("Error: ${ex.message}")    
    }
}

В переменную dataStr присваиваем наш async await и в блоке try catch проверяем на ошибки. Если все ок, то возвращаем результат, если возникает ошибка - выбрасываем throw Exception("Error: ${ex.message}")

По такому же принципу читаем файл

suspend fun getContentAsync(file: String): InputStream = 
    coroutineScope {    
        val dataStr = async(Dispatchers.IO) {        
            FileInputStream(file)    
        }    
        try {       
            dataStr.await()    
        } catch (ex: Exception) {        
            throw Exception("Error: ${ex.message}")    
        }
 }

Больше статей на эту тему читайте в моем блоге - https://fox-code.ru/