在我通过一个Set映射后,我必须将它显式地转换回Set。例如:
fun getNewSet(oldSet: Set<String>): Set<String> {
return oldSet
.map{ getNewStringFromOld(it) }
.toSet()
}
在没有明确地将其转换回Set?
的情况下映射整个集合的正确方法是什么?答案 0 :(得分:14)
查看库代码,唯一的另一种方法是调用mapTo
来获取目标集合:
oldSet.mapTo(HashSet<String>()) { getNewStringFromOld(id) }
我不确定默认是错误的。问题是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)
}