Exploring the Kotlin 1.5 Standard Library

This article discusses some of the standard library changes that come under the Kotlin 1.5 version. Please find each of them below.
1. New collection functions
Consider you have a list of objects, all with a nullable property, and you want to get the first non-null value of that property in the collection. Usually, you would first use mapNotNull()
to get a collection of all non-null values and then call firstOrNull()
to get the final value.
In Kotlin 1.5 we have functions firstNotNullOf()
and firstNotNullOfOrNull()
. The function firstNotNullOf()
returns first non-null value of the passed selector, or exception thrown if no element matches. The function firstNotNullOfOrNull()
returns the first non-null value of the passed selector, or null if no element matches.
The functionfirstNotNullOf()
is the combination of mapNotNull()
and first()
. The same way firstNotNullOfOrNull()
is the combination of mapNotNull()
and firstOrNull()
.
Please check the below code for more information.
data class Employee(val name: String, val designation: String?)val employees = listOf(
Employee("Felix", null),
Employee("Vee", null),
Employee("Ram", "Developer"),
Employee("Vivek", "Senior Developer"),
Employee("Joe", "Developer"),
)// Old method
val firstDesignation = employees.mapNotNull { it.designation }.firstOrNull()// Kotlin 1.5 method
val newfirstDesignation = employees.firstNotNullOfOrNull { it.designation }
2. Unsigned integer types Ubyte, UShort, UInt and ULong
These types of unsigned numbers are useful wherever you want to constrain a type to only contain non-negative values. They can also be more intuitive when you are working on bit and byte level, manipulating pixels in bitmaps, the bytes in a file, or other binary data.
UByte
: an unsigned 8-bit integer, ranges from 0 to 255UShort
: an unsigned 16-bit integer, ranges from 0 to 65535UInt
: an unsigned 32-bit integer, ranges from 0 to 2^32 - 1ULong
: an unsigned 64-bit integer, ranges from 0 to 2^64 - 1
3. Integer floor division and mod operator
The new function floorDiv()
provides floored division on integers. The floored division always rounds the result down.
(5).floorDiv(3) -> returns 1
(-5).floorDiv(3) -> returns -2
The remainder function, called ‘mod’ returns the remainder of the floored division. This is entirely different from the ‘%’ operator, called ‘rem’ in Kotlin.
Consider the below code,
val a = -4
val b = 3println(-4 % 3) -> -1
println(a.mod(b)) -> 2
Here, the ‘%’ operation returns remainder as -1. But a.mod(b)
is the difference between a
and a.floorDiv(b) * b
. It’s either zero or has the same sign as b
, while a % b
can have a different one.
4. char-to-integer conversion API
For individual characters, Kotlin introduced functions that make their conversion into numbers more expressive. When you are converting a character into a number, you can mean one of two things: you either mean the char code for the character in question, or you mean the actual digit the character represents, parsing the number. Both of these can be concisely express with the new conversion API. It introduced Char
conversions that are divided into the following sets of clearly named functions:
- Functions to get the integer code of
Char
and to constructChar
from the given code:
fun Char(code: Int): Char
fun Char(code: UShort): Char
val Char.code: Int
- Functions to convert
Char
to the numeric value of the digit it represents:
fun Char.digitToInt(radix: Int): Int
fun Char.digitToIntOrNull(radix: Int): Int?
- An extension function for
Int
to convert the non-negative single digit it represents to the correspondingChar
representation:
fun Int.digitToChar(radix: Int): Char
5. Char category in multiplatform code
Provided a number of functions to check character properties available in common code. They help you when you want to check if a character is a digit, a letter, or either one of them, whether a letter is an upper, lower, or title case, and if its Unicode representation is defined or an ISO sequence.
'1'.isDigit() -> true
'A'.isLetter() -> true
'!'.isLetterOrDigit() -> false
'C'.isLowerCase() -> false
'C'.isUpperCase() -> true
'b'.isTitleCase() -> false
'?'.isDefined() -> true
'\n'.isISOControl() -> true
6. String/Char case conversion functions
Kotlin 1.5 introduced a new locale-agnostic API for uppercase/lowercase text conversion. Locale-agnostic means that no matter the language settings on the target system, you will get consistent case conversion results. So, the new API helps you avoid errors due to different locale settings. Please find the old and new methods below.
String
conversion functions:-

Char
conversion functions:-

If you want locale-based conversion, you need to explicitly specify the locale as below.
“kotlin”.uppercase(Locale.forLanguageTag(“tr-TR”))
7. Strict version of String?.toBoolean()
Introduced String.toBooleanStrict()
and String.toBooleanStrictOrNull()
functions. The functionString.toBooleanStrict()
throws exception for all inputs other than that of ‘true’ or ‘false’ literals. This is case sensitive too. As it is case-sensitive, the example "true".toBooleanStrict()
gives output as true but "True".toBooleanStrict()
throws exceptions.
String.toBooleanStrictOrNull()
will not throw an exception, instead, it gives null
for all inputs other than that of ‘true’ or ‘false’ literals. This is also case-sensitive.
"true".toBooleanStrictOrNull()
-> returns true
"True".toBooleanStrictOrNull()
-> returns null
I hope you learned some of the Kotlin standard library changes here. If you need to know more about this, you can use the documentation.
If you need any help, join me on LinkedIn and Github. If you liked this article, share it with fellow Kotlin developers.
Now you are ready to go. Thanks for reading!