diff --git a/libraries/stdlib/samples/test/samples/collections/collections.kt b/libraries/stdlib/samples/test/samples/collections/collections.kt index 4ce34529044..74e94c21a69 100644 --- a/libraries/stdlib/samples/test/samples/collections/collections.kt +++ b/libraries/stdlib/samples/test/samples/collections/collections.kt @@ -51,6 +51,18 @@ class Collections { assertPrints(collection.orEmpty(), "[a, b, c]") } + @Sample + fun collectionIsNullOrEmpty() { + val nullCollection: Collection? = null + assertTrue(nullCollection.isNullOrEmpty()) + + val emptyCollection: Collection? = listOf() + assertTrue(emptyCollection.isNullOrEmpty()) + + val collection: Collection? = listOf('a', 'b', 'c') + assertFalse(collection.isNullOrEmpty()) + } + @Sample fun collectionContainsAll() { val collection = mutableListOf('a', 'b') diff --git a/libraries/stdlib/src/kotlin/collections/Collections.kt b/libraries/stdlib/src/kotlin/collections/Collections.kt index 7f1202ef524..c738016f946 100644 --- a/libraries/stdlib/src/kotlin/collections/Collections.kt +++ b/libraries/stdlib/src/kotlin/collections/Collections.kt @@ -10,6 +10,7 @@ package kotlin.collections import kotlin.* import kotlin.comparisons.compareValues +import kotlin.internal.contracts.* internal object EmptyIterator : ListIterator { override fun hasNext(): Boolean = false @@ -168,6 +169,19 @@ public val List.lastIndex: Int @kotlin.internal.InlineOnly public inline fun Collection.isNotEmpty(): Boolean = !isEmpty() +/** + * Returns `true` if the collection is null or if it is empty. + * @sample samples.collections.Collections.Collections.collectionIsNullOrEmpty + */ +@kotlin.internal.InlineOnly +public inline fun Collection?.isNullOrEmpty(): Boolean { + contract { + returns(false) implies (this@isNullOrEmpty != null) + } + + return this == null || this.isEmpty() +} + /** * Returns this Collection if it's not `null` and the empty list otherwise. * @sample samples.collections.Collections.Collections.collectionOrEmpty