package com.yz8

import org.junit.Test

class test {
@Test
def test: Unit = { val ints = List(1,5,7,6,8)
println(ints.head)//1
println(ints.tail)//List(5, 7, 6, 8) //判断集合是否为空
println(ints.isEmpty)
println(ints==Nil)
} @Test
def test2(): Unit ={
val ints = List(1,5,7,6,8)
def sum(list:List[Int]): Int ={
if(list==Nil){
return 0
}
list.head+sum(list.tail)
}
val i = sum(ints)
println(i)//27
//一般不用return返回值 一般当作break来用 } @Test
def test3():Unit={
//会产生一个新的集合,不是对原有集合的更改 //集合的首尾添加
val a=List(1,2,3)
val b=List(5,6,7) //尾添加
val c=a.++(b)//1
println(c) //首添加 (除了点以外三个符号)
val d=a.++:(b)
println(d)
val e=a.:::(b)
println(e) //尾部添加元组
val f=a.:+(7,8,9)//2
println(f)//List(1, 2, 3, (7,8,9)) //首部加元组 (除了点以外两个符号)
val g = a.+:(7,8,9)
println(g) val h = a.::(7,8,9)
println(h) } @Test
def test4():Unit={
val a=List(1,2,3,4,5,6,7,8,9)
val b = a.drop(3)
println(b)//List(4, 5, 6, 7, 8, 9) val c = a.dropRight(3)
println(c)//List(1, 2, 3, 4, 5, 6) val a2=List(8,2,2,1,5,7,9)
// val d = a2.dropWhile(_%2==0)
val d = a2.dropWhile((x)=>x%2==0)//逐个匹配去除符合条件的元素,直到不符合条件,之后的元素不再判断
println(d)//List(1, 5, 7, 9) //查询
println( a2(0))
//修改
//a2(0)=999// 修改失败 不导包不能修改,因为List默认是不可变包中的List
println(a2(0)) val ints = scala.collection.mutable.ListBuffer[Int](1,5,6)
println(ints(0))
ints(0)=999
println(ints(0))
} //A=B B=C 推出A=C 等效推算(定义变量/定义集合这些存数据的地方,默认常用不可变) 很多东西默认不可变,更符合机器逻辑 @Test
def test5(): Unit ={
val a="ccc"::("bbb"::("aaa"::Nil))
println(a)//List(ccc, bbb, aaa) val b=List(1,2,3)
val c=List(3,4,5)
val d=b++c//List(1, 2, 3, 3, 4, 5)
println(d)
println(b.sum)//6 val list = List(1, 2, 3, 4, 5, 6, 7)
println(list.take(5))//List(1, 2, 3, 4, 5)
println(list.takeWhile(_<=3))//List(1, 2, 3)
println(list.takeWhile(_>3))//List()
println(list.mkString)//1234567
println(list.count(_%2==0))//3 } }
package com.yz8

import org.junit.Test

import scala.beans.BeanProperty
import scala.collection.mutable class test2 { @Test
def test1(): Unit ={
val set=Set(1,2,6)
val set2=set+(1,2,8)
set2.foreach(println(_)) } @Test
def test2(): Unit ={
//set不保留添加顺序
val set=Set(1,2,6,'a','b')
set.foreach(println(_))
//1
//6
//97
//2
//98 //linkHashSet保留添加顺序
val linkset=scala.collection.mutable.LinkedHashSet(1,3,6,'a','b')
linkset.foreach(println(_))
//1
//3
//6
//97
//98 println("__________") //SortedSet 默认升序
val sortedset=scala.collection.mutable.SortedSet(1,4,6,-100,-1) sortedset.foreach(println(_))
} @Test
def test3(): Unit ={
//按名字升序,按年龄升序[向集合中传递一个比较器] var set=mutable.SortedSet[Person]()(new Ordering[Person] {
override def compare(x: Person, y: Person): Int = {
//按名字比较
val ret=x.getName.compareTo(y.getName) if(ret==0){
val ret=x.getAge.compareTo(y.getAge)
}
ret }
}) set.add(new Person("a",20))
set.add(new Person("w",30))
set.add(new Person("e",50))
set.add(new Person("f",10))
set.foreach(println(_)) } @Test
def test4(): Unit ={
//命题:按年龄升序,如果相同,名字降序
val set = mutable.SortedSet[Person2]() set.add(new Person2("a",20))
set.add(new Person2("w",30))
set.add(new Person2("e",50))
set.add(new Person2("f",10))
set.foreach(println(_)) //两种方式实现SortedSet的比较规则:
// 1在SortedSet中传递Ordering的比较器
//2被比较对象类中extends Ordered特质
//2选1 本质上两种方式都是重写了compare()方法
} @Test
def test5(): Unit ={
//foreach val data=1 to 10
//data.foreach(println(_)) //高阶函数
data.foreach(x=>println(x)) println("-------------")
val list = List("aa","bb","cc","dd")
//val strings = list.map(_+1+4)
val strings = list.map(x=>x+1+4)
//将元素作用在一个函数上
//y=x+1 strings.foreach(println(_)) //flatMap
println("----------------")
val list2 = List("aa bb cc","aa ff","cc","ww cc")
//分割单词
list2.flatMap(_.split(" ")).foreach(println(_)) } @Test
def test6(): Unit ={
//匹配
var name=""
val ch:Char='7' name=ch match {
case 'b'=>"小明"
case 'a'=>"小红"
case 'w'=>"小黑"
case 'f'=>"小白"
case _ if Character.isDigit(ch)=>"王思冲"//一般把case _放在末尾,放在第一行不管什么情况都会只执行该语句
//如果没有_ 匹配不上会报MatchError case _ if Character.isAlphabetic(ch)=>"薛之谦"
}
println(name)
} @Test
def test7(): Unit ={
//相当于 .foreach()
"Hello, world" foreach(c=>println(
c match {
case ' '=>"空格"
case y=>"中国"+y //y不是去匹配,而是作为变量接收值
}
//case后如果写值,就表示匹配这个值,如果写变量名,就表示接收这个值
))
//中国H
//中国e
//中国l
//中国l
//中国o
//中国,
//空格
//中国w
//中国o
//中国r
//中国l
//中国d
} @Test
def test8(): Unit ={
//println(Int.MaxValue)//2147483647 //代替isInstanceOf和asInstanceOf
def myConvert(x:Any):Int={
val retust=
x match {
case i:Int=>i
case s:String=>Integer.parseInt(s)
case m:BigInt=>Int.MaxValue
case c:Char=>c.toInt
case _=>0
}
retust }
val res1 = myConvert("123")
println(res1==123)//true
val res2 = myConvert(true)
println(res2) } @Test
def test9(): Unit ={
val tup=(5,6)//注元组中无法匹配这两种情况既case(x,y)和case_
tup match {
case (1,2)=>println(1,2)
case (0,_)=>println(0+".....")//元组中不能用_*
case (x,y)=>println(x+"...."+y)
case _=>println("其它情况")
}
} @Test
def test10(): Unit ={
val array = Array(1)
array match {
case Array(0)=>println(0)//只有一个元素且为0
case Array(x,y)=>println(x+" "+y)//两个元素
case Array(0,_*)=>println(0+"...")//任意以0开头
case _=>println("else")
}
} @Test
def test11(): Unit ={
//样例类(类前加case 关键字)--可以用match case结构中
case class Abc(name:String)
case class Efg(name:String,age:Int)
case class Xyz(name:String,address:String)
//样例类会自动为属性添加get set 也会字段提供伴生对象
val abc = Abc("小白")//创建了一个abc对象
println(abc.name) var x=Efg("哈哈",100)
x match {
case Abc(name)=>println(s"$name")
case Efg(name,age)=>println(s"$name----$age")
case Xyz(name,address)=>println(s"$name-----$address")
case _=>println("默认选项")
}
} @Test
def test12(): Unit ={
//样例类 模拟枚举(列举)
sealed abstract class TrafficLightColor//交通灯
case object Red extends TrafficLightColor
case object Yellow extends TrafficLightColor
case object Green extends TrafficLightColor def show(color:TrafficLightColor):Unit={
color match {
case Red => println("红灯")
case Yellow => println("黄灯")
case Green => println("绿灯")
}
}
show(Yellow) } @Test
def test13(): Unit ={
//了解option--兼容有值Some()或没值None 可以支持泛型
val map = Map("a"->10,"b"->20,"c"->30)
def show(x:Option[Int]): Unit ={
x match {
case Some(s)=>println(s)
case None=>println("没值")
}
}
show(map.get("f"))//没值
show(map.get("a"))//10 println(map.get("a"))//Some(10)
println(map.get("e"))//None
} @Test
def test14(): Unit ={
val a:Option[Int]=Some(5)
val b:Option[Int]=None
//能取到值就取出原值,取不出就取出默认值
println(a.getOrElse(0))//5
println(b.getOrElse(100))//100 println(a.isEmpty)//判断是否为空
println(b.isEmpty)
} } class Person{
@BeanProperty
var name:String=_
@BeanProperty
var age:Int=_ override def toString = s"Person($name, $age)" def this(n:String,a:Int){
this()
this.name=n
this.age=a
} } class Person2 extends Ordered[Person2]{
@BeanProperty
var name:String=_
@BeanProperty
var age:Int=_ override def toString = s"Person($name, $age)" def this(n:String,a:Int){
this()
this.name=n
this.age=a
} override def compare(that: Person2): Int = {
//升序--前者比后者
//降序--后者比前者
//命题:按年龄升序,如果相同,名字降序
val ret = this.age.compareTo(that.age) if(ret==0){
val ret = that.name.compareTo(this.name)
}
ret
}
}

Scala集合库、模式匹配和样例类的更多相关文章

  1. Scala基础:模式匹配和样例类

    模式匹配 package com.zy.scala import scala.util.Random /** * 模式匹配 */ object CaseDemo { def main(args: Ar ...

  2. 学好Spark/Kafka必须要掌握的Scala技术点(二)类、单例/伴生对象、继承和trait,模式匹配、样例类(case class)

    3. 类.对象.继承和trait 3.1 类 3.1.1 类的定义 Scala中,可以在类中定义类.以在函数中定义函数.可以在类中定义object:可以在函数中定义类,类成员的缺省访问级别是:publ ...

  3. 大数据学习day16------第三阶段-----scala04--------1. 模式匹配和样例类 2 Akka通信框架

    1. 模式匹配和样例类 Scala有一个十分强大的模式匹配机制,可以应用到很多场合:如switch语句.类型检查等.并且Scala还提供了样例类,对模式匹配进行了优化,可以快速进行匹配 1.1 模式匹 ...

  4. 【Scala篇】--Scala中Trait、模式匹配、样例类、Actor模型

    一.前述 Scala Trait(特征) 相当于 Java 的接口,实际上它比接口还功能强大. 模式匹配机制相当于java中的switch-case. 使用了case关键字的类定义就是样例类(case ...

  5. Scala模式匹配和样例类

    Scala有一个十分强大的模式匹配机制,可以应用到很多场合:如switch语句.类型检查等.并且Scala还提供了样例类,对模式匹配进行了优化,可以快速进行匹配. 1.字符匹配     def mai ...

  6. Scala学习十四——模式匹配和样例类

    一.本章要点 match表达式是更好的switch,不会有意外调入下一个分支 如果没有模式能够匹配,会抛出MatchError,可以用case _模式避免 模式可以包含一个随意定义的条件,称做守卫 你 ...

  7. scala模式匹配与样例类

    样本类:添加了case的类便是样本类.这种修饰符可以让Scala编译器自动为这个类添加一些语法上的便捷设定.如下: 1.添加与类名一致的工厂方法.也就是说,可以写成Var("x") ...

  8. Scala-Unit6-final/type关键字、样例类&样例对象

    一.关键字 1.final关键字 用final修饰的类:不能被继承 用final修饰的方法:不能被重写 注意:(1)在Scala中变量不需要用final修饰,因为val与var已经限制了变量是否可变 ...

  9. Scala--模式匹配和样例类

    模式匹配应用场景:switch语句,类型查询,析构,样例类 一.更好的switch val ch :Char = '+' val sign = ch match{ case '+' => 1 c ...

随机推荐

  1. #3使用html+css+js制作网页 番外篇 制作接收php

    使用html+css+js制作网页 番外篇 制作接收php 本系列链接 基础 php语法 例子 本系列链接 #1使用html+css+js制作网站教程 准备 #2使用html+css+js制作网站教程 ...

  2. git 中.gitignore文件不生效

    .gitignore文件 新增忽略文件并没有生效 新增的忽略文件没有生效,是因为git是有缓存的,而之前的文件在缓存中,并不会清除掉,还会继续提交,所以更新.gitignore文件,要清除缓存文件 g ...

  3. 【SpringMVC】SpringMVC 拦截器

    SpringMVC 拦截器 文章源码 拦截器的作用 SpringMVC 的处理器拦截器类似于 Servlet 开发中的过滤器 Filter,用于对处理器进行预处理和后处理. 谈到拦截器,还有另外一个概 ...

  4. Python模块化编程与装饰器

    Python的模块化编程 我们首先以一个例子来介绍模块化编程的应用场景,有这样一个名为requirements.py的python3文件,其中两个函数的作用是分别以不同的顺序来打印一个字符串: # r ...

  5. java创建线程安全的类

    如果一个对象想要被多个线程安全的并发访问,那么这个对象必须是或线程安全的或事实不可变的或由锁来保护的. 1.java监视器模式 大多数对象都是组合对象.当从头开始构建一个类,或者将多个非线程安全的类组 ...

  6. 查询数据库v$session时报部分多维元组字元

    在查询v$session视图时,出现如下图报错,基本原因是用plsql dev时使用汉字打开新标签,导致v$session action栏位出现乱码 解决方法: select SID,SERIAL#, ...

  7. Docker 如何动态给SpringBoot项目传参

    关于SpringBoot配置数据源 在项目开发中,我们往往需要配置多套不同的配置环境例如:本地开发.测试环境.部署环境.每一个环境的数据源配置可能都不同,因此需要写不同的数据源配置.如果用Docker ...

  8. Development desciptor

    概述与作用: 部署描述符是用于描述Web应用程序的元数据,并为Java EE Web应用程序服务器部署和运行Web应用程序提供指令.从传统上来说,所有元数据都来自于部署描述符文件/WEB-INF/we ...

  9. 二. SpringCloud基本Rest微服务工程搭建

    1. 父工程构建 1.1 Maven项目搭建 环境 版本 JDK 1.8 Maven 3.6+ Maven模板 maven-archetype-size 删除父工程src文件 1.2 父工程pom文件 ...

  10. CSS不用背景图片实现优惠券样式反圆角,凹圆角,反向半圆角,并且背景渐变

    日常开发过程中,特别是商城相关应用开发过程中,时常会遇到花里胡哨的设计图,比如优惠券样式,上图: 实现思路如下:     1.先写一个外容器,实现背景色渐变: Html: 1 <div clas ...