It would be a terrible ambiguity if T?.filter { } meant something completely different from T.filter { } for certain T types:
val collection = listOf("foo", "bar", "")
var collection2: List<String>? = collection //type could be not so explicit
collection2 = collection2.filter { it.isNotEmpty() }
collection2 = collection.filter { it.isNotEmpty() }
Could you tell at glance which filter does what?
That’s why we had to find different names for the similar concept functions like filter/takeIf: to disambiguate the operation, because they can be used on the same receiver.