【问题标题】:Idiomatic way to transform map in kotlin?在 kotlin 中转换地图的惯用方式?
【发布时间】:2017-06-24 04:59:39
【问题描述】:

在 Scala 中,它只是 map 函数。例如,如果 hashMap 是字符串的 hashMap,那么您可以执行以下操作:

val result : HashMap[String,String] = hashMap.map(case(k,v) => (k -> v.toUpperCase))

然而,在 Kotlin 中,map 将地图转换为列表。在 Kotlin 中是否有惯用的方式来做同样的事情?

【问题讨论】:

  • mapKeysmapValues 或将groupBy 应用于简单map 的结果怎么样?
  • @yeputons。我不知道。你告诉我这是不是惯用语。随意添加答案
  • 你应该接受@James-bassett 的回答

标签: hashmap kotlin


【解决方案1】:

我不认为一个人的意见算惯用的,但我可能会使用

// transform keys only (use same values)
hashMap.mapKeys { it.key.uppercase() }

// transform values only (use same key) - what you're after!
hashMap.mapValues { it.value.uppercase() }

// transform keys + values
hashMap.entries.associate { it.key.uppercase() to it.value.uppercase() }

注意:或toUpperCase() 之前的 Kotlin 1.5.0

【讨论】:

  • 这也是我会做的,虽然如果你只是转换值,那么你可以使用mapValues 代替(例如hashMap.mapValues { it.value.toUpperCase() })但我个人不喜欢mapValues 的签名,因为它使用transform: (Map.Entry<K, V>) -> R 而不是transform: (V) -> R,这在我看来与filterValues(predicate: (V) -> Boolean) 不一致,这意味着你不能写hashMap.mapValues(String::toUpperCase),所以我只使用hashMap.entries.associate { ... }
  • 更新到包括mapValues(),谢谢@mfulton26
  • 最后一行很漂亮。感谢这个例子,Kotlin 确实很棒。
【解决方案2】:

您可以使用其他人建议的stdlib mapValues function

hashMap.mapValues { it.value.uppercase() }

或解构

hashMap.mapValues { (_, value) -> value.uppercase() }

我相信这是最惯用的方式。

【讨论】:

    【解决方案3】:

    toMap 函数似乎是为此而设计的:

    hashMap.map { (key, value) ->
          key.toLowerCase() to value.toUpperCase()
        }.toMap()
    

    它将Iterable<Pair<K, V>> 转换为Map<K, V>

    【讨论】:

    • 这里是一个不必要的转换toMap 为了更好的性能和更少的代码使用方法来自@James Bassett 上面的回答
    • 不是?我需要的,但引导我解决了我的问题。谢谢!
    【解决方案4】:

    我发现了另一个变种。好像更清楚了

    val result = mapOf( *hashMap.map { it.key.toUpperCase() to it.value.toUpperCase() }.toTypedArray() ) 
    

    它会自动推断结果地图的类型。

    .toTypedArray() 需要使用splat(*) 运算符。

    【讨论】:

      猜你喜欢
      • 2019-11-07
      • 2017-04-02
      • 1970-01-01
      • 2016-03-28
      • 1970-01-01
      • 2014-07-03
      • 2016-04-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多