隐含地映射到Kotlin中

时间:2017-03-20 20:56:21

标签: kotlin

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

fun getNewSet(oldSet: Set<String>): Set<String> {
return oldSet
        .map{ getNewStringFromOld(it) }
        .toSet()
}

在没有明确地将其转换回Set?

的情况下映射整个集合的正确方法是什么?

1 个答案:

答案 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)
}