From 292f69936b065034e839582e8216774b6f5e9007 Mon Sep 17 00:00:00 2001 From: Jeff Wright Date: Tue, 20 Feb 2018 10:03:27 -0600 Subject: [PATCH] Add Collections.isNullOrEmpty #KT-23279 --- .../test/samples/collections/collections.kt | 12 ++++++++++++ .../stdlib/src/kotlin/collections/Collections.kt | 14 ++++++++++++++ 2 files changed, 26 insertions(+) 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