Scala中的Map使用例子

Map结构是一种非常常见的结构,在各种程序语言都有对应的api,由于Spark的底层语言是Scala,所以有必要来了解下Scala中的Map使用方法。

(1)不可变Map

特点:

api不太丰富

如果是var修饰,引用可变,支持读写

如果是val修饰,引用不可变,只能写入一次值,其后只读

var a:Map[String,Int]=Map("k1"->1,"k2"->2)//初始化构造函数
    a += ("k3"->3)//添加元素
    a += ("k4"->4)//添加元素
    a += ("k1"->100)//已经存在添加元素会覆盖
    a -= ("k2","k1")//删除元素
//    a("k1") = "foo"//不支持
    println(a.contains("k6"))//是否包含某元素
    println(a.size)//打印大小
    println(a.get("k1").getOrElse("default")) //根据key读取元素,不存在就替换成默认值
    a.foreach{case (e,i) => println(e,i)} //遍历打印1
    for( (k,v)<-a ) println(k,v) //遍历打印2
    println(a.isEmpty)//判断是否为空
    a.keys.foreach(println)//只打印key
    a.values.foreach(println)//只打印value
    a=Map()//数据清空使用再次new
    println(a.size)
    a.toSeq.sortBy(_._1)//升序排序 key
    a.toSeq.sortBy(_._2)//升序排序 value
    a.toSeq.sortWith(_._1>_._1) //降序排序 key
    a.toSeq.sortWith(_._2>_._2) //降序排序 value
    
    //下面自定义按英文字母或数字排序
    implicit  val KeyOrdering=new Ordering[String] {
      override def compare(x: String, y: String): Int = {
        x.compareTo(y)
      }
    }
    println(a.toSeq.sorted)
(2)可变Map例子

特点:

api丰富与Java中Map基本类似

如果是var修饰,引用可变,支持读写

如果是val修饰,引用不可变,支持读写

def map3(): Unit ={
  //不可变Map+var关键词修饰例子
  var a:scala.collection.mutable.Map[String,Int]=scala.collection.mutable.Map("k1"->1,"k2"->2)//初始化构造函数
  a += ("k3"->3)//添加元素
  a += ("k4"->4)//添加元素
  a += ("k1"->100)//已经存在添加元素会覆盖
  a += ("k1"->100,"k9"->9)//添加多个元素
  a -= ("k2","k1")//删除元素
  a ++= List("CA" -> 23, "CO" -> 25)//追加集合
  a --= List("AL", "AZ")//删除集合

  a.retain((k,v)=> k=="k1")//只保留等于k1元素,其他的删除
  a.put("put1",200)//put
  a.remove("k2")//remove
  a.clear()//清空
  a("k3")=100//支持

  println(a.contains("k6"))//是否包含某元素
  println(a.size)//打印大小
  println(a.get("k1").getOrElse("default")) //根据key读取元素,不存在就替换成默认值
  a.foreach{case (e,i) => println(e,i)} //遍历打印1
  for( (k,v)<-a ) println(k,v) //遍历打印2
  println(a.isEmpty)//判断是否为空
  a.keys.foreach(println)//只打印key
  a.values.foreach(println)//只打印value
  a=scala.collection.mutable.Map()//引用能变
  println(a.size)
  a.toSeq.sortBy(_._1)//排序 key
  a.toSeq.sortBy(_._2)//排序 value
  a.toSeq.sortWith(_._1>_._1) //降序排序 key
  a.toSeq.sortWith(_._2>_._2) //降序排序 value
  
      //下面自定义按英文字母或数字排序
  implicit  val KeyOrdering=new Ordering[String] {
    override def compare(x: String, y: String): Int = {
      x.compareTo(y)
    }
  }
  println(a.toSeq.sorted)
}






有什么问题可以扫码关注微信公众号:我是攻城师(woshigcs),在后台留言咨询。 技术债不能欠,健康债更不能欠, 求道之路,与君同行。

输入图片说明


<think>好的,用户的问题是关于在IntelliJ IDEA中使用Scalamap函数示例。首先,我需要确认用户的需求。他们可能刚接触Scala,或者不太熟悉如何在IDE中编写和运行代码。用户提到了寻找map函数的例子,因此我需要提供一个清晰的示例,涵盖基本用法,可能还包括一些进阶技巧,比如链式操作或与其他集合方法结合使用。 接下来,我需要考虑如何结构回答。按照用户的要求,应该分步骤说明,确保每个部分都清晰。首先,设置项目环境是必要的,因为用户可能不熟悉如何在IDEA中配置Scala项目。引用[1]提到Maven和sbt,这里可能需要提到使用sbt,因为它是Scala的官方构建工具,但用户已经配置过Maven,所以可能需要简要说明两种方式,但示例可能使用sbt更简单。 然后,代码示例是关键。需要展示基本的map用法,比如对列表中的每个元素进行操作,转换类型等。同时,可以展示链式操作,比如map后接filter,这样用户可以看到如何组合使用集合方法。此外,高阶函数的使用,比如传递匿名函数,也是重要的一点,可以展示Scala的函数式特性。 另外,用户可能对性能优化感兴趣,引用[3]提到函数对象可能产生临时对象,影响性能。因此,在示例中可能需要提到优化建议,比如使用内联函数或避免闭包,但这可能对新手来说有点复杂,所以可以简单提及,让用户知道有这些优化方法存在。 还需要注意代码格式,确保使用正确的LaTeX格式,比如行内公式用$...$,独立公式用$$...$$。不过在这个问题中可能不太需要数学公式,但需要确保代码块正确标记,并且整体结构符合用户的要求。 用户还要求生成相关问题,可能需要考虑map函数与其他集合方法的区别,性能优化,异常处理,以及并行处理等。引用[4]提到的HBase可能不相关,但其他引用中的并发模型(如Future和Akka)可能相关,可以建议用户参考这些内容来进一步学习并发情况下的map使用。 最后,确保回答引用正确,比如在提到伴生对象时引用[2],或者在优化建议时引用[3]。检查所有引用是否恰当,并且自然融入回答中,不显得突兀。 总结步骤: 1. 确认用户的环境配置,指导创建Scala项目。 2. 提供map函数的基础示例,包括简单转换、类型转换和链式操作。 3. 提到性能优化点,引用相关文档。 4. 生成相关问题,覆盖常见的使用场景和潜在问题。 5. 确保引用正确,格式符合要求,代码示例正确无误。</think>### 分步解答:Scala中`map`函数在IntelliJ IDEA中的使用示例 #### 1. 环境配置 在IntelliJ IDEA中使用Scala的`map`函数,需先创建Scala项目: - **步骤1**:新建项目 → 选择**Scala** → 使用`sbt`(官方推荐工具)或`Maven`[^1] - **步骤2**:添加Scala SDK(建议2.13.x或3.x版本) #### 2. `map`函数基础用法 `map`用于对集合元素进行转换,返回新集合。以下示例可直接在`src/main/scala`中创建Scala文件运行: ```scala object MapExample { def main(args: Array[String]): Unit = { // 示例1:数值翻倍 val numbers = List(1, 2, 3) val doubled = numbers.map(x => x * 2) println(doubled) // 输出: List(2, 4, 6) // 示例2:类型转换(Int转String) val strings = numbers.map(_.toString + "kg") println(strings) // 输出: List(1kg, 2kg, 3kg) // 示例3:链式操作(map + filter) val filtered = numbers.map(_ * 3).filter(_ > 5) println(filtered) // 输出: List(6, 9) } } ``` #### 3. 高阶用法与优化 - **匿名函数简化**:`numbers.map(_ * 2)`等价于`numbers.map(x => x * 2)` - **避免闭包**:若操作复杂,优先定义具名函数而非嵌套闭包[^3] - **并行集合**:使用`par`实现并行计算(如`numbers.par.map(...)`) #### 4. 常见问题排查 - **类型错误**:确保Lambda表达式返回值类型匹配目标类型 - **空集合处理**:`map`对空集合安全,直接返回空集合 --- ###
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值