Scala常用函数

Scala集合操作实战

以下代码块,直接复制,粘贴上机测试便可

    /**
      * Created by Administrator on 2017/1/11.
      *
      */
    object Scalatest {


      def main(args: Array[String]): Unit = {
        println("ceshi")

        MaxMin

        Filter

        DiffIntersectUnionDis

        Map

        Partition

        Reduce

        Sort

        Count

        GroupBy
      }


      case class Book(title : String ,pages : Int)

      //Seq(列表) -> 类比java的数组
      val Books = Seq(
        Book("Future of Scala developer",85),
        Book("Parallel algorithms",240),
        Book("Object Oriented Programming",130),
        Book("Mobile Development",495)
      )

      /**
        * 场景:求最大最小值
        * maxBy 最大值
        * minBy 最小值
        */
      def MaxMin (): Unit ={
        //获取最大的一个
        //Max is :Book(Mobile Development,495)
        println("Max is :" + Books.maxBy(book => book.pages))
        //Max is :Mobile Development
        println("Max is :" + Books.maxBy(book => book.pages).title)
        //Max is :495
        println("Max is :" + Books.maxBy(book => book.pages).pages)
        //获取最小的一个
        //Min is :Book(Future of Scala developer,85)
        println("Min is :" + Books.minBy(book => book.pages))
        //Min is :Future of Scala developer
        println("Min is :" + Books.minBy(book => book.pages).title)
        //Min is :85
        println("Min is :" + Books.minBy(book => book.pages).pages)
      }


      /**
        * 场景: 过滤数据
        * filter 过滤
        */
      def Filter(): Unit ={
        var filbook = Seq[Book]()
        //返回一个集合
        println("over 200 is : ")
        filbook = Books.filter(book => book.pages >= 200)
        //240 495
        for(i <- 0 to filbook.size-1){
          println(filbook(i).pages)
        }
      }

      /**
        * 场景:集合的差交并重功能
        * diff,以前者为主,取前者差集
        * intersect,以前者为主,取两者交集
        * union,两个集合取并集
        * distinct,去重
        */
      def DiffIntersectUnionDis(): Unit ={
        val num1 = Seq(1,2,3,4,5,6)
        val num2 = Seq(4,5,6,7,8,9)

        var Di = Seq[Int]()
        var Inter = Seq[Int]()
        var Un = Seq[Int]()
        //list(1,2,3)
        Di = num1.diff(num2)
        Di.foreach(print)
        println()
        //list(4,5,6)
        Inter = num1.intersect(num2)
        Inter.foreach(print)
        println()
        //list(1,2,3,4,5,6,4,5,6,7,8,9)
        Un = num1.union(num2)
        Un.foreach(print)
        println()
        Un.distinct.foreach(print)
      }

      /**
        * 场景: 对数据处理
        * map函数的逻辑是遍历集合中的元素并对每个元素调用函数,返回函数使用后的值
        */
      def Map(): Unit ={
        val numbers = Seq(1,2,3,4,5,6)
        var number1 = Seq[Int]()
        var Stringadd = Seq[String]()
        number1 = numbers.map(n => n*2)
        println()
        //list(2,4,6,8,10,12)
        number1.foreach(print)
        Stringadd = numbers.map(n => n.toString + "ceshi")
        println()
        //list(1ceshi,2ceshi,3ceshi,4ceshi,5ceshi,6ceshi)
        Stringadd.foreach(print)
      }

      /**
        * 场景:将指定的集合按照自定的规则拆分成两个新的集合
        * partition,分组
        */
      def Partition(): Unit ={
        val numbers = Seq(1,2,3,4,5,6,7,8,9)
        val (list1,list2) = numbers.partition(n => n % 2 == 0)
        println()
        list1.foreach(print)
        println()
        list2.foreach(print)
      }

      /**
        * reduce : 定义一个变化f, f把两个列表的元素合成一个,遍历列表,最终把列表合并单一元素
        */
      def Reduce(): Unit ={
        val nums =List(1,2,3)
        //6
        val sum1 = nums.reduce((a,b) => a+b)
        //6
        val sum2 = nums.reduce(_+_)
        //6
        val sum3 = nums.sum
      }

      /**
        *sortBy :按照应用函数f之后产生的元素进行自然排序
        *sortWith :使用自定义的比较函数排序
        *sorted :按照元素自身排序
        *PS: 作用于list
        */
      case class User(name : String,mark : Int)
      def Sort(): Unit ={
        val nums =List(1,3,2,4)
        val sorted = nums.sorted
        //List(1,2,3,4)
        println()
        sorted.foreach(print)

        val user = List (("Homeway",25),("XSDYM",23),("ceshi",28))
        //case 使用自定类
        val sortedByAge = user.sortBy(User => User._2)
        //(XSDYM,23)(Homeway,25)(ceshi,28)
        sortedByAge.foreach(print)
        println()
        //case Scala的模式匹配(匹配List)
        val sortedWith = user.sortWith( {case (user1,user2) => user1._2 > user2._2})
        //(ceshi,28)(Homeway,25)(XSDYM,23)
        sortedWith.foreach(print)
      }

      /**
        * Count: 按照一定f函数统计所需数据
        */
      def Count(): Unit ={
        val nums = List(-1,-2,0,1,2)
        val plusCnt1  = nums.count( _ >= 0)
        println(plusCnt1)
        val plusCnt2  = nums.filter( _ > 0).length
        println(plusCnt2)
      }

      /**
        * groupBy : 将列表进行分组,分组的依据是应用f在元素上后产生的新元素
        * grouped : 按列表按照固定的grouped(4)大小进行分组 4个元素一组
        */
      def GroupBy(): Unit ={
        val data = List(("jie","male"),("jian","female"),("xian","male"),("jie1","male"),("jian1","female"),("xian1","male"))
        val group1 = data.groupBy(_._2)
        //map ("male"->list(("jie","male"),("xian","male")),"femail"->list("jian","femail"))
        val groupMap = data.groupBy({case (name,sex)=>sex})
        println()
        //Map(male -> List((jie,male), (xian,male), (jie1,male), (xian1,male)), female -> List((jian,female), (jian1,female)))
        println(groupMap.toString)

        val fixSizeGroupMap = data.grouped(4)
        println()
        //List((jie,male), (jian,female), (xian,male), (jie1,male))
        //List((jian1,female), (xian1,male))
        fixSizeGroupMap.foreach(println)
      }



    }
<think>我们被要求回答关于Scala中map函数的使用方法和相关知识。根据提供的引用,我们可以总结如下: 引用[1]指出:.map是一个高阶函数,用于对集合中的每个元素应用一个函数,并返回一个新的集合。 引用[2]展示了如何将方法作为参数传递给map函数(因为Scala中方法可以自动转换为函数)。 引用[3]详细说明了map函数的作用:遍历集合、转换元素、不改变原集合、简化代码,并给出了一个示例。 引用[4]给出了一个使用map将数组每个元素乘以2的示例。 因此,我们的回答应涵盖以下内容: 1. map函数的基本概念:高阶函数,用于转换集合中的每个元素,返回新集合。 2. map函数的特点:不改变原集合(函数式编程的不可变性)。 3. 使用方法:可以直接传递函数字面量(匿名函数)或已定义的方法(方法会自动转换为函数)。 4. 示例代码。 同时,根据系统指令: - 行内数学表达式使用$...$(但本问题可能不涉及数学表达式,所以可以忽略) - 独立公式使用$$...$$(同样,可能不需要) - 使用中文回答 - 生成相关问题 另外,注意在回答中引用的段落末尾添加引用标识。 回答结构建议: 1. 介绍map函数。 2. 解释map函数的工作原理和特点。 3. 展示使用示例(代码)。 4. 讨论为什么可以将方法传递给map(根据引用[2])。 5. 注意事项(如果有)。 6. 生成相关问题。 注意:引用标识要自然地添加在引用的内容末尾。由于我们参考了多个引用,需要标注清楚。 示例回答: ### Scala中的map函数Scala中,`map`是一个高阶函数,用于对集合(如List、Array等)中的每个元素应用一个给定的函数,并返回一个新的集合,新集合的元素是原集合元素经过该函数转换后的结果。`map`函数体现了函数式编程的核心思想之一:不可变性(即原始集合不会被修改)[^1][^3]。 #### map函数的特点 1. **遍历与转换**:`map`会遍历集合中的每个元素,并对每个元素应用指定的转换函数。 2. **返回新集合**:转换的结果会存入一个新的集合中,而原始集合保持不变[^3]。 3. **代码简洁**:使用`map`可以避免显式的循环,使代码更简洁和易读[^3]。 #### 使用方法 `map`函数的使用形式为: ```scala val newCollection = collection.map(f) ``` 其中,`collection`是原始集合,`f`是一个函数,它接收一个元素(类型为原集合元素的类型)并返回一个新值(类型可以不同)。 参数`f`可以是: - 一个函数字面量(匿名函数) - 一个已经定义的方法(Scala会自动将方法转换为函数)[^2] ##### 示例1:使用匿名函数 ```scala val numbers = List(1, 2, 3, 4, 5) val doubled = numbers.map(x => x * 2) // doubled: List(2,4,6,8,10) ``` ##### 示例2:使用方法 ```scala def multiplyByThree(x: Int): Int = x * 3 val tripled = numbers.map(multiplyByThree) // tripled: List(3,6,9,12,15) ``` 在示例2中,我们定义了一个方法`multiplyByThree`,然后将其作为参数传递给`map`函数。这是因为Scala编译器会自动将方法转换为一个函数(这个过程称为ETA展开)[^2]。 #### 注意事项 - `map`函数可以用于任何集合类型(如List、Array、Set、Map等),但对于Map集合,`map`操作的是键值对(元组)。 - 转换函数的返回值类型可以不同于输入类型,因此我们可以将集合中的元素转换成任意类型。 例如,将整数列表转换为字符串列表: ```scala val strings = numbers.map(x => s"Number: $x") ``` #### 总结 `map`是Scala中非常强大且常用函数,它允许我们以一种声明式的方式对集合进行转换操作,避免了命令式编程中的循环和临时变量。掌握`map`对于编写函数式风格的Scala代码至关重要。 §§相关问题§§ 1. Scala中的`map`函数与`flatMap`函数有何区别? 2. 除了`map`,Scala中还有哪些常用的高阶函数? 3. 在Scala中,如何对Map集合使用`map`函数? 4. 为什么说`map`函数体现了函数式编程的不可变性? </think>### Scala中的`map`函数详解 `map`是Scala函数式编程的核心高阶函数,用于对集合元素进行转换操作。以下结合引用内容详细说明: #### 一、核心概念 1. **转换本质** `map`遍历集合中的每个元素,对其应用指定函数,生成包含转换结果的新集合,原始集合保持不变[^1][^3]。 数学表示:$f: A \rightarrow B$,输入集合$[a_1, a_2, ..., a_n]$,输出$[f(a_1), f(a_2), ..., f(a_n)]$ 2. **函数式特性** - 不修改原集合(满足不可变性原则)[^3] - 返回新集合,类型可与原集合不同 - 支持链式调用(如`list.map(f).map(g)`) #### 二、使用方法 ##### 1. 基础语法 ```scala val newCollection = originalCollection.map(转换函数) ``` ##### 2. 参数类型 可接受**函数**或**方法**作为参数(Scala自动将方法转为函数)[^2]: ```scala // 方式1:匿名函数(直接定义) List(1,2,3).map(x => x * 2) // 返回 List(2,4,6) // 方式2:预定义方法 def triple(n: Int) = n * 3 List(1,2,3).map(triple) // 返回 List(3,6,9)[^2] ``` ##### 3. 集合类型支持 适用于所有标准集合: ```scala // List示例 List("a","b").map(_.toUpperCase) // List("A","B") // Array示例(引用[4]) Array(1,2,3,4).map(a => 2*a) // Array(2,4,6,8)[^4] // Map特殊处理(注意操作的是键值对) Map(1->"A", 2->"B").map { case (k,v) => (k+10, v) } // Map(11->"A", 12->"B") ``` #### 三、关键特性 1. **延迟计算** 在`View`或`LazyList`中使用时,转换按需执行,提升性能。 2. **类型推断** Scala能自动推断返回类型: ```scala val nums: List[String] = List(1,2,3).map(_.toString) // 自动推断为List[String] ``` 3. **并行处理** 通过`.par`启用并行`map`: ```scala (1 to 100000).par.map(_ * 2) // 多线程并行计算 ``` #### 四、注意事项 1. 转换函数应**无副作用**,避免修改外部状态 2. 对`Option`集合操作时,`map`仅处理`Some`值: ```scala Some(5).map(_ * 2) // Some(10) None.map(_ * 2) // None(无操作) ``` 3. 与`flatMap`区别:`map`返回嵌套集合时需用`flatMap`展开
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值