3

null キーまたは値を持つエントリを除外する拡張関数があります。

fun <K, V> Map<K?, V?>.filterNotNull(): Map<K, V> = this.mapNotNull { 
   it.key?.let { key -> 
      it.value?.let { value -> 
         key to value 
      }
   }
}.toMap()

これは、null 許容のキーと値を持つマップで機能します。

data class Stuff(val foo: Int)

val nullMap = mapOf<String?, Stuff?>(null to (Stuff(1)), "b" to null, "c" to Stuff(3))
assert(nullMap.filterNotNull().map { it.value.foo } == listOf(3))

ただし、null 非許容のキーまたは値を持つものではありません。

val nullValues = mapOf<String, Stuff?>("a" to null, "b" to Stuff(3))    
assert(nullValues.filterNotNull().map { it.value.foo } == listOf(3))

Type mismatch: inferred type is Map<String, Stuff?> but Map<String?, Stuff?> was expected
Type inference failed. Please try to specify type arguments explicitly.

拡張機能を両方のケースで機能させる方法はありますか、それとも 2 つの別個の機能を提供する必要がありますか?

4

3 に答える 3

7

理由は後でわかりますが、マップへの追加は機能しています。

fun <K : Any, V : Any> Map<out K?, V?>.filterNotNull(): Map<K, V> = ...
于 2019-11-11T11:05:18.833 に答える