隐含地映射到Kotlin中

ars*_*v31 10 kotlin

在我映射一个Set之后,我必须将它显式地转换回Set.例如:

fun getNewSet(oldSet: Set<String>): Set<String> {
return oldSet
        .map{ getNewStringFromOld(it) }
        .toSet()
}
Run Code Online (Sandbox Code Playgroud)

在没有明确地将其转换回Set的情况下映射整个集合的正确方法是什么?

Jon*_*ols 15

查看库代码,唯一的另一种方法是调用mapTo哪个获取目标集合:

oldSet.mapTo(HashSet<String>()) { getNewStringFromOld(id) }
Run Code Online (Sandbox Code Playgroud)

我不确定默认是错的.问题是map可能以导致非唯一值列表的方式使用.如果有一个特殊版本Set.map()返回了一个集合,则无法以这种方式使用map - 任何非唯一值都将替换结果中的值.我当然可以看到这样的情况map应该总是导致一个与源集合大小相同的集合,如果map创建了一个Set,那么情况并非总是如此.

如果你经常这样做,也许只需创建自己的扩展功能:

public inline fun <T, R> Iterable<T>.mapToSet(transform: (T) -> R): Set<R> {
  return mapTo(HashSet<R>(), transform)
}
Run Code Online (Sandbox Code Playgroud)

  • 顺便说一下,提供的解释是完全正确的.Scala将集合映射到集合,如果不小心使用它会导致错误 (2认同)