From ce8e511b79167c7b24a241a51a9daecb4c7ed970 Mon Sep 17 00:00:00 2001 From: Abduqodiri Qurbonzoda Date: Thu, 13 Feb 2020 14:46:14 +0300 Subject: [PATCH] Add setOfNotNull function #KT-35851 --- .../test/samples/collections/collections.kt | 12 ++++++++++++ .../stdlib/src/kotlin/collections/Sets.kt | 19 +++++++++++++++++++ .../stdlib/test/collections/CollectionTest.kt | 12 ++++++++++++ .../kotlin-stdlib-runtime-merged.txt | 2 ++ 4 files changed, 45 insertions(+) diff --git a/libraries/stdlib/samples/test/samples/collections/collections.kt b/libraries/stdlib/samples/test/samples/collections/collections.kt index ddfbc0a1b92..ce73fb30f51 100644 --- a/libraries/stdlib/samples/test/samples/collections/collections.kt +++ b/libraries/stdlib/samples/test/samples/collections/collections.kt @@ -334,6 +334,18 @@ class Collections { assertPrints(set, "[1, 2, 4, 5]") } + @Sample + fun setOfNotNull() { + val empty = setOfNotNull(null) + assertPrints(empty, "[]") + + val singleton = setOfNotNull(42) + assertPrints(singleton, "[42]") + + val set = setOfNotNull(1, null, 2, null, 3) + assertPrints(set, "[1, 2, 3]") + } + @Sample fun emptyLinkedHashSet() { val set: LinkedHashSet = linkedSetOf() diff --git a/libraries/stdlib/src/kotlin/collections/Sets.kt b/libraries/stdlib/src/kotlin/collections/Sets.kt index 9628034285a..d655110b931 100644 --- a/libraries/stdlib/src/kotlin/collections/Sets.kt +++ b/libraries/stdlib/src/kotlin/collections/Sets.kt @@ -90,6 +90,25 @@ public inline fun linkedSetOf(): LinkedHashSet = LinkedHashSet() */ public fun linkedSetOf(vararg elements: T): LinkedHashSet = elements.toCollection(LinkedHashSet(mapCapacity(elements.size))) +/** + * Returns a new read-only set either with single given element, if it is not null, or empty set if the element is null. + * The returned set is serializable (JVM). + * @sample samples.collections.Collections.Sets.setOfNotNull + */ +@SinceKotlin("1.4") +public fun setOfNotNull(element: T?): Set = if (element != null) setOf(element) else emptySet() + +/** + * Returns a new read-only set only with those given elements, that are not null. + * Elements of the set are iterated in the order they were specified. + * The returned set is serializable (JVM). + * @sample samples.collections.Collections.Sets.setOfNotNull + */ +@SinceKotlin("1.4") +public fun setOfNotNull(vararg elements: T?): Set { + return elements.filterNotNullTo(LinkedHashSet()) +} + /** * Builds a new read-only [Set] by populating a [MutableSet] using the given [builderAction] * and returning a read-only set with the same elements. diff --git a/libraries/stdlib/test/collections/CollectionTest.kt b/libraries/stdlib/test/collections/CollectionTest.kt index 68e81c659b3..2501024122a 100644 --- a/libraries/stdlib/test/collections/CollectionTest.kt +++ b/libraries/stdlib/test/collections/CollectionTest.kt @@ -71,6 +71,18 @@ class CollectionTest { assertEquals(listOf("value1", "value2"), l3) } + @Test fun setOfNotNull() { + val l1: Set = setOfNotNull(null) + assertTrue(l1.isEmpty()) + + val s: String? = "value" + val l2: Set = setOfNotNull(s) + assertEquals(s, l2.single()) + + val l3: Set = setOfNotNull("value1", null, "value2") + assertEquals(setOf("value1", "value2"), l3) + } + @Test fun filterIntoSet() { val data = listOf("foo", "bar") val foo = data.filterTo(hashSetOf()) { it.startsWith("f") } diff --git a/libraries/tools/binary-compatibility-validator/reference-public-api/kotlin-stdlib-runtime-merged.txt b/libraries/tools/binary-compatibility-validator/reference-public-api/kotlin-stdlib-runtime-merged.txt index 08d7d36b582..f8dcebede58 100644 --- a/libraries/tools/binary-compatibility-validator/reference-public-api/kotlin-stdlib-runtime-merged.txt +++ b/libraries/tools/binary-compatibility-validator/reference-public-api/kotlin-stdlib-runtime-merged.txt @@ -2369,6 +2369,8 @@ public final class kotlin/collections/SetsKt { public static final fun plus (Ljava/util/Set;[Ljava/lang/Object;)Ljava/util/Set; public static final fun setOf (Ljava/lang/Object;)Ljava/util/Set; public static final fun setOf ([Ljava/lang/Object;)Ljava/util/Set; + public static final fun setOfNotNull (Ljava/lang/Object;)Ljava/util/Set; + public static final fun setOfNotNull ([Ljava/lang/Object;)Ljava/util/Set; public static final fun sortedSetOf (Ljava/util/Comparator;[Ljava/lang/Object;)Ljava/util/TreeSet; public static final fun sortedSetOf ([Ljava/lang/Object;)Ljava/util/TreeSet; }