Scala学习二(01),Scala集合,元组,Araay,Set,List,Map及常用方法

本文深入探讨Scala中的各种集合操作,包括Array、List、Map、Set等,同时讲解了匿名函数与方法转换函数的运用,展示了Scala的强大特性和灵活性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

匿名函数演示

package date0813.sample01_AnonymousFunDemo

/**
  * Description;匿名函数演示<br/>
  * Copyright(c):Minchen<br/>
  * This program is protected by copyright laws.<br/>
  * Date:  2019/8/13  星期二 15:51
  *
  * @author:Minchen
  * @Email:751914788 @qq.com
  * @version 1.0 
  */
object AnonymousFunDemo {
  //方法的关键字是def,函数的关键字是var,方法和函数之间可相互转换,通过 _

  var f = () => println("这是一个无参的函数")

  def main(args: Array[String]): Unit = {
    val x, y = 3
   // println(s"x=$x,y=$y")
    //调用包含函数类型的方法
    var result=twoNumOperate(x,y,(x,y)=>x+y)
    println(s"$x+$y=$result")
    println("\n_______________________________________\n")

    result=twoNumOperate(x,y,(x,y)=>x-y)
    println(s"$x-$y=$result")
    println("\n_______________________________________\n")

    //定义一个函数,myFun
    val myFun=(x:Int,y:Int)=>x*y
    result=twoNumOperate(x,y,myFun)
    println(s"$x*$y=$result")




  }
  //设计一个方法,该方法要求对两个整数进行操作(+,-,*,/)
  def twoNumOperate(x:Int,y:Int,f:(Int,Int)=>Int)={
    f(x,y)
  }
}

运行效果

在这里插入图片描述

方法转换函数演示

package date0813.sample02_Method2FunDemo

/**
  * Description:方法转换成函数演示<br/>
  * Copyright(c):Minchen<br/>
  * This program is protected by copyright laws.<br/>
  * Date:  2019/8/13  星期二 19:34
  *
  * @author:Minchen
  * @Email:751914788 @qq.com
  * @version 1.0 
  */
object Method2FunDemo {
  def main(args: Array[String]): Unit = {
    //方式1:调用一个方法时,若该方法包含函数类型的形参,可以直接传入方法,内部自动将方法转换成函数(隐式转换)
    var result = commonMethod(2, 4, add)
    //add的类型必须要与函数的类型保持一致
    println(s"result=$result")

    //方式2:调用一个方法时,若该方法包含函数类型的形参,那么,可以先将待传入的方法通过神奇的下划线转换为函数
    //在方法后面加上空格和_
    result = commonMethod(3, 5, add _)
    println(s"result=$result")

  }

  //自定义方法之求两个数的和
  def add(x: Int, y: Long): Double = (x + y).toDouble

  //自定义方法包含函数
  def commonMethod(x: Int, y: Long, f: (Int, Long) => Double): Double = {
    f(x, y)
  }

}

运行效果

在这里插入图片描述

可变集合ArrayBuffer演示

package date0813.sample03_array

import scala.collection.mutable.ArrayBuffer

/**
  * Description:可变数组之ArrayBuffer演示<br/>
  * Copyright(c):Minchen<br/>
  * This program is protected by copyright laws.<br/>
  * Date:  2019/8/13  星期二 20:03
  *
  * @author:Minchen
  * @Email:751914788 @qq.com
  * @version 1.0 
  */
object ArrayBufferDemo {
  def main(args: Array[String]): Unit = {
    //ArrayBuffer需要导入这个类,Any相当于java中的Object,局限于泛型
    val container = ArrayBuffer[Any]()

    //+=  向Arraybuffer添加一个元素
    container +=2
    println(s"可变长数组中的元素是:$container")

    // 小括号中有多个元素组成元祖
    container +=(3,4,5)
    println(s"可变长数组中的元素是:$container")

    //++=  将两个集合合并为一个集合
    container ++=Array(7,8,9)
    println(s"可变长数组中的元素是:$container")

    //append 调用append方法添加一个元素
    container.append(10,11,12)
    println(s"可变长数组中的元素是:$container")

    //trimEnd 从末尾数消除一个元素
    container.trimEnd(1)
    println(s"可变长数组中的元素是:$container")

    //trimStart 从开头数消除两个元素
    container.trimStart(2)
    println(s"可变长数组中的元素是:$container")

    //remove 消除小标为0的元素
    container.remove(0)
    println(s"可变长数组中的元素是:$container")

    //insert 从下标为3的开始插入元素"ok",true,"you"    数据类型可以不一样
    //这些可变数组走可以参考可变参数进行思考
    container.insert(3,"ok",true,"you")
    println(s"可变长数组中的元素是:$container")

  }
}

运行效果

在这里插入图片描述

不可变Array演示

package date0813.sample03_array

/**

  • Description:xxx

  • Copyright©:Minchen

  • This program is protected by copyright laws.

  • Date: 2019/8/13 星期二 20:06

  • @author:Minchen

  • @Email:751914788 @qq.com

  • @version 1.0
    */
    object ArrayDemo {
    def main(args: Array[String]): Unit = {
    //需求1:定义一个长度是5的Int型的数组
    val nums=new ArrayInt
    //遍历
    for(perEle<- nums)
    println(perEle)

    println(s"数组中的最后一个元素: n u m s ( n u m s . l e n g t h − 1 ) &quot; ) n u m s ( 0 ) = 88 p r i n t l n ( s &quot; 数 组 中 的 第 一 个 元 素 : {nums(nums.length-1)}&quot;) nums(0)=88 println(s&quot;数组中的第一个元素: nums(nums.length1)")nums(0)=88println(s":{nums(0)}")
    println(s"数组中的最后一个元素:${nums(nums.length-1)}")

    println("\n_______________________________\n")
    //需求2:向定长数组中存入指定的元素
    val names=ArrayString
    println(s"打印names中的元素:${names.toBuffer}")

    println("\n_______________________________\n")
    //需求3:向定长数组中存入不同类型的元素
    val stu=Array(“zhangsan”,true,189.34)
    println(s"stu中的元素是:${stu.toBuffer}")

}

}

运行效果

在这里插入图片描述

可变Map演示

package date0813.sample04_map

import scala.collection.mutable

/**
  * Description:可变的Map映射演示<br/>
  * Copyright(c):Minchen<br/>
  * This program is protected by copyright laws.<br/>
  * Date:  2019/8/13  星期二 20:55
  *
  * @author:Minchen
  * @Email:751914788 @qq.com
  * @version 1.0 
  */
object MutableMapDemo {
  def main(args: Array[String]): Unit = {
    //需求:构建可变的Map映射的实例,并初始化,然后向其中添加元素,移除元素,遍历
    //需要导入个mutable包
    var stus = mutable.Map[String, Int]("张三丰" -> 88, "张学友" -> 100, "张靓颖" -> 18)
    println(s"Map映射中的元素是:$stus")

    println("______________________________________")
    //①添加新的元素
    stus("张三丰") = 100
    stus.update("Andy", 100)
    println(s"Map映射中的元素是:$stus")
    println("____________________________")
    //②连续添加多个元素
    //1)元组方式
    stus += ("panchaosheng" -> 22, "cengzuojiang" -> 38, "xiaogaobing" -> 28)
    println(s"Map映射中的元素是:$stus")
    // ++= 这个方式是将两个集合合并
    val stus2 = mutable.Map("minchen" -> 18, "haiping" -> 18)
    stus ++= stus2
    println(s"Map映射中的元素是:$stus")

    //①移除元素
    stus -= "张三丰"
    println(s"Map映射中的元素是:$stus")

    println("_____________________________________")

    //④遍历Map映射
    //根据键来遍历
    for (perEle <- stus.keySet)
      println(perEle + "\t" + stus(perEle))

    println("\n_______________________________________\n")
    //b)使用元组
    for ((k, v) <- stus)
      println(k + "\t" + v)
  }
}

运行效果

在这里插入图片描述

不可变的Map演示

package date0813.sample04_map

/**
  * Description:不可变的Map映射演示<br/>
  * Copyright(c):Minchen<br/>
  * This program is protected by copyright laws.<br/>
  * Date:  2019/8/13  星期二 20:45
  *
  * @author:Minchen
  * @Email:751914788 @qq.com
  * @version 1.0 
  */
object sample04_map {
  def main(args: Array[String]): Unit = {
    val students = Map("andy"-> 90,"leon"-> 80,"marry"->18)
    val ele = students("andy")

    val value=students.get("leon").get
    println(s"value=$value")
    //给marry设置个默认值,如果students中有marray,则是其对应的值,如果没有则是默认值0
    val value2=students.getOrElse("marry",0)
    println(s"value2=$value2")

    //下述的语法编译报错:不可变的Map映射不能添加新的元素
    // students("kate") = 80
  }

}

运行效果

在这里插入图片描述

元组及zip演示

package date0813.sample05_TupleDemo

/**
  * Description:元组演示<br/>
  * Copyright(c):Minchen<br/>
  * This program is protected by copyright laws.<br/>
  * Date:  2019/8/13  星期二 21:32
  *
  * @author:Minchen
  * @Email:751914788 @qq.com
  * @version 1.0 
  */
object TupleDemo {
//方法,返回多个值,可以将多个值封装到元组中一并返回
  def getValue: (Int, Boolean) = {
    val value1=90
    val value2=true
    (value1,value2)
  }

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

    println("\n_____________________________________________\n")
    //元组是一一对应的值
    val t, (a, b, c, d) = (1, true, 20, ("jack", 89))
    println(s"元组中第二个元素是:${t._2}")
    println(s"元组中第二个元素是:$b")
    println(s"元组中第四个元素中的第二个元素是:${t._4._2}")
    println(s"元组中第四个元素中的第二个元素是:${d._2}")

    println("\n_____________________ ________________________\n")
    //拉链操作
    val names = Array("jack", "marry", "tom", "andy")
    val ages = Array(19, 29, 18, 18, 16)
    //注意泛型的类型,要用括号括起来
    val stuInfo:Array[(String,Int)]=names.zip(ages)
    println(s"使用拉链操作合并后,新的数组中的元素是:${stuInfo.toBuffer}")
    //拉链操作的适用场景
    val ages2 = Array(19, 29, 18)
    val heights = Array(192, 178.89, 166.89)
    val weights = Array(89, 48.89, 66.89)
    val result: Array[((Int, Double), Double)] = ages2 zip heights zip weights
    val studentInfs: Array[(Int, Double, Double)] = result.map(perEle => (perEle._1._1, perEle._1._2, perEle._2))
    println(s"学生的信息是:${studentInfs.toBuffer}")
  }

}

运行效果

在这里插入图片描述

不可变List演示

package date0813.sample06_list

/**
  * Description:不可变的List集合演示<br/>
  * Copyright(c):Minchen<br/>
  * This program is protected by copyright laws.<br/>
  * Date:  2019/8/14  星期三 08:52
  *
  * @author:Minchen
  * @Email:751914788 @qq.com
  * @version 1.0
  */
object ImmutableListDemo {
  def main(args: Array[String]): Unit = {
      var lst=List(1,2)
    //    a)将元素添加到列表之前
    //    元素::列表  等价于 List列表的实例.::(元素)
    //    等价于 +:
    val lst2=0::lst
    println(s"元集合是:$lst,新集合是:$lst2")
    println("\n___________________________________\n")
    //    b)将元素添加到列表的后面
    //    :+
    val lst3 =lst:+3
    println(s"元集合是:$lst,新集合是:$lst3")
    println("\n___________________________________\n")

    //    c)将两个List集合合并成新的List集合
    //    ++
    val lst4=lst++ List(3,4)
    println(s"元集合是:$lst,新集合是:$lst4")
    println("\n___________________________________\n")

    //    d)将指定的集合添加到源集合之前
    //    ++:
    println("\n___________________________________\n")
    val lst5 = List(3, 4) ++: lst
    println(s"新的集合是:$lst5")

    println("\n___________________________________\n")
    //    e)将指定的集合添加到源集合之后
    //      .:::
    val lst6=List(3,4).:::(lst)
    println(s"新的集合是:$lst6")
  }
}

运行效果

在这里插入图片描述

可变List演示

package date0813.sample06_list

import scala.collection.mutable.ListBuffer

/**
  * Description:可变的List集合演示<br/>
  * Copyright(c):Minchen<br/>
  * This program is protected by copyright laws.<br/>
  * Date:  2019/8/14  星期三 17:31
  *
  * @author:Minchen
  * @Email:751914788 @qq.com
  * @version 1.0 
  */
object MutableListDemo {
  def main(args: Array[String]): Unit = {

    val container = ListBuffer[Any]()
    //常用方法
    //    a) 向指定的ListBuffer中新增元素
    //    append
    //    +=
    container.append("jack")
    container +="marray"
    println(s"可变的ListBuffer中的元素是:$container")
    println("________________________________________________")

    //    b)  将一个ListBuffer中的元素取出来,追加到当前ListBuffer中
    //    ++=
    container++=ListBuffer("marry","张三丰")
    println(s"可变的ListBuffer中的元素是:$container")
    println("________________________________________________")

    //    c) 将两个ListBuffer合并起来,生成一个全新的ListBuffer
    //    ++
    val newContainer:ListBuffer[Any]=container ++ ListBuffer("marry","孤独求败")
    println(s"可变的ListBuffer中的元素是:$newContainer")
    println("________________________________________________")
    //    d)将 元素添加到ListBuffer的末尾,生成一个全新的ListBuffer(原来的ListBuffer没有发生变化)
    //    :+
    val newContainer2: ListBuffer[Any]=container :+ "tom"
    println(s"新的可变的ListBuffer中的元素是:$newContainer2,旧的ListBuffer元素是:$container")

  }

}

运行效果

在这里插入图片描述

Set演示

package date0813.sample07_set

import scala.collection.mutable

/**
  * Description:Set集合用法演示<br/>
  * Copyright(c):Minchen<br/>
  * This program is protected by copyright laws.<br/>
  * Date:  2019/8/14  星期三 19:33
  *
  * @author:Minchen
  * @Email:751914788 @qq.com
  * @version 1.0 
  */
object SetDemo extends App {
  //1)不可变的Set集合
  val container = Set[Int]()
  //  +
  val container2 = container + 2
  println(s"源集合中的元素是:$container,新的集合container2中的元素是:$container2 ")

  println("\n______________________________________\n")
  //   ++
  val container3 = container2 ++ Set(3, 4, 2, -9, -7, 12, 10)
  println(s"源集合中的元素是:$container2,新的集合container3中的元素是:$container3 ")

  println("\n_____________ +++++++++++++++++++++++_________________________\n")
  //2)可变的Set集合
  val names = mutable.Set[String]()
  //  +=
  names += "jackson"
  println(s"源集合中的元素是:$names ")

  //  ++
  val names2: mutable.Set[String] = names ++ Set("marry")
  println(s"源集合中的元素是:$names,新的集合中的元素:$names2 ")

  //  add
  names.add("jerry")
  println(s"源集合中的元素是:$names")

  //  -=
  names -= "jerry"
  println(s"源集合中的元素是:$names")

  //  remove
  val result = names.remove("jackson2")
  println(s"移除成功否?$result,源集合中的元素是:$names")

}

效果演示

在这里插入图片描述

集合常用的方法演示

package date0813.sample08_collection

/**
  * Description:xxx<br/>
  * Copyright(c):Minchen<br/>
  * This program is protected by copyright laws.<br/>
  * Date:  2019/8/14  星期三 19:42
  *
  * @author:Minchen
  * @Email:751914788 @qq.com
  * @version 1.0 
  */
object CollectionDemo  extends App {
  val nums = Seq(1, 2, 3, 4, 5)

  //常用方法
  //  sum:求和
  println(s"集合中所有元素的和是:${nums.sum}")

  println("\n___________________________________\n")

  //  max:最大值
  println(s"集合中最大值是:${nums.max}")

  println("\n___________________________________\n")

  //  min:最小值
  println(s"集合中最小值是:${nums.min}")

  println("\n___________________________________\n")

  //  count:计数
  //满足条件的计数
  println(s"集合中偶素元素个数是:${nums.count(_ % 2 == 0)}")
  println(s"集合中元素个数是:${nums.size}")

  println("\n___________________________________\n")

  //  minBy & maxBy 方法解决了复杂数据的问题。你只需选择决定数据最大或最小的属性(case修饰的类称之为样例类,编译器会为其生成诸多的源码:如,序列化,伴生类,伴生对象等等)
  val books: Seq[Book] = Seq(Book("十万个为什么", 1000), Book("Hadoop", 900), Book("Spark", 1299))
  //指定按什么排序
  //需求:求出页码最多、最少的图书的信息
  println(s"页码最多的图书的信息:${books.maxBy(_.pageNum)}")
  println(s"页码最少的图书的信息:${books.minBy(_.pageNum)}")
  println("\n___________________________________\n")

  //  filter
  //需求:筛选出图书的页码>=1000的图书信息
  //这个是简化版的
  //books.filter(_.pageNum >= 1000).foreach(println)
  books.filter(perEle => perEle.pageNum >= 1000).foreach(println)


  println("\n___________________________________\n")
  //flatten:压平,使用该方法的前提是集合中每个元素的类型是集合类型,作用:将所有子集合中的元素拿出来置于一个新的集合找那个存储起来。
  val eles: Seq[Array[Int]] = Seq(Array(1, 2), Array(3, 4))
  val result: Seq[Int] = eles.flatten
  println(s"集合经过flatten操作后,结果是:$result")

  println("\n___________________________________\n")
  //求差集,交集,并集
  val nums1 = Seq(1, 2, 3)
  val nums2 = Seq(3, 4, 5)
  println(s"两个集合的差集是:${nums1.diff(nums2)}") //1,2
  println(s"两个集合的交集是:${nums1.intersect(nums2)}") //3
  println(s"两个集合的并集是:${nums1.union(nums2)}") //1, 2, 3 ,3, 4, 5
  println(s"两个集合去重之后的并集是:${nums1.union(nums2).distinct}") //1, 2, 3 ,3, 4, 5

  println("\n___________________________________\n")
  //flatMap:= map + flatten,先进行map操作,然后进行flattern。
  //map函数 + 合并函数 = flatMap函数
  val names = Array("jack", "tom", "marry")
  //List[JACK,jack,TOM,tom,MARRY,marry]
  println(s"${names.flatMap(perEle => List(perEle.toUpperCase, perEle)).toBuffer}")

  val numsTmp = Seq(1, 2, 3)
  val finalResult = numsTmp.flatMap(perEle => Array(Math.pow(perEle, 2))).sum
  println(s"最终的结果是:$finalResult")

}
/**
  * 样例类
  *
  * @param title
  * @param pageNum
  */
case class Book(title: String, pageNum: Int)


运行效果

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值