Scala
scala基础
数据类型
易混淆:
变量和常量的声明
package scala.basic
/**
* scala:
* 1. scala object 相当于java中的单例,object中定义的全是静态的(相当与java的工具类)
* 2. scala 中定义变量使用var,定义常量使用val,变量可变,常量不可变
* 3. scala 中每行后面会有分号自动推断机制,可以不写“;”
* 4. 建议Scala中命名使用驼峰命名法
*/
object objectClass {
def main(args: Array[String]): Unit = {
val a = 100;
var b = 200
b = 300
println(a)
println(b)
}
}
类和对象
package scala.basic
/**
* scala:
* 5. Scala类中可以传参,传参一定要指定类型,有了参实就有了默认构造
* 6. 类中属性默认有getter和setter方法
* 7. 类中重写构造,构造中第一行必须先调用默认构造。def this(。。){。。}
* 8. Scala当new class 时,类中除了方法不执行【除构造】,其他都执行。在类中可直接写语句
* 9. 在同一个scala文件中,class名称和Object名称一样时,这个类叫做这个对象的伴生类,这个对象叫做这个类的半生对象,它们可以互相访问私有变量
* 10. 对象不能传参,要传参,使用apply方法
*/
//类
class Person(name:String,age:Int){
val xname = name
var xage = age
var gender = 'M'
//重写构造
def this(yname:String,yage:Int,ygender:Char){
//必须调用默认构造
this(yname,yage)
this.gender = ygender
}
//方法
def sayName():Unit = {
println("hello " + xname)
}
}
//对象
object objectClass {
def main(args: Array[String]): Unit = {
val p = new Person("lisi",20)
println(p.xname)
println(p.xage)
p.xage = 40
println(p.xage)
}
}
简单语法
-
if 语句与java没有区别
-
for循环
for(i <- 1 to 10){println(i)}
-
1 to 10 :左闭右闭
-
1 until 10 :左闭右开
-
九九乘法表
package scala.basic object basic { def main(args: Array[String]): Unit = { for (i <- 1 to 9) { for (j <- 1 to i) { print(j + "*" + i + "=" + i * j + "\t") //print(s"$i * $j = " + i*j) } println() } } } //方法二 for (i <- 1 to 9;j <- 1 to i) { print(j + "*" + i + "=" + i * j + "\t") if(i==j) println() }
-
-
while与do…while
与java相同
方法与函数
方法的定义
-
语法:
def max//名称(x:Int,y:Int//参数):Int//返回值 = { //方法体 }
package scala.basic
object fangfa {
def main(args: Array[String]): Unit = {
/**
* 方法定义
* 1. 方法体的返回值可以省略,没有return时可省略,默认将方法体中最后一行作为返回结果
* 2. 方法体最后可以使用return,如果使用了return,那么方法体的返回类型一定要指定
* 3. 定义的方法传入的参数一定要指定类型
* 4. 方法的方法体如果可以一行写完那方法体的括号可以省略
* 5. 如果定义方法省略了方法名称和方法体间的“=”,那么无论方法体最后一行计算的结果都会被丢弃,返回Unit
*
* @param a
* @param b
* @return
*/
def max(a: Int, b: Int): Int = {
if (a > b) {
a
} else {
b
}
//方法二
//if(a > b) a else b
}
println(max(100,2))
}
}
其余函数
package scala.basic
import java.util.Date
object 方法2 {
def main(args: Array[String]): Unit = {
/**
* 递归方法要显式的显示返回类型
* @param num
* @return
*/
def fun(num:Int): Int ={
if(num == 1){
1
}else{
num*fun(num-1)
}
}
println(fun(5))
/**
* 参数有默认值的方法
*/
def fun1(a:Int=10,b:Int=20): Int ={
a+b
}
/**
* 可变长参数的方法
* 多个参数只能传同种类型的
*/
def fun2(s:String*): Unit ={
s.foreach(println)
}
fun2("a","b","c")
/**
* 匿名函数
* (a:Int,b:Int) => {a+b}
*/
val function: (Int, Int) => Int = (a:Int,b:Int) => {a+b}
println(function(10, 20))
/**
* 嵌套方法
*/
def fun3(num:Int): Int ={
def fun4(a:Int):Int={
if(a == 1){
1
}else{
a*fun(a-1)
}
}
fun4(num)
}
println(fun3(5))
/**
* 偏应用函数
* 某些情况下,方法中参数非常多,每次调用只有固定的某个参数变化其他的都不变,可以定义偏应用函数
*/
def showlog(date:Date,log:String): Unit ={
println("date is " + date + "log is " + log)
}
val date = new Date()
showlog(date,"a")
showlog(date,"b")
showlog(date,"c")
def fun6 = showlog(date,_:String)
fun6("aaa")
/**
* 高级函数
* 1. 方法的参数是函数
* 2. 方法的返回是函数
* 3. 方法的参数和返回都是函数
*/
//参数是函数
def fun7(f:(Int,Int)=>Int,s:String): Int ={
val i: Int = f(100,200)
i
}
def f(a:Int,b:Int) ={
a+b
}
println(fun7(f, "aa"))
println(fun7((a: Int, b: Int) => {
a * b
}, "aaaa"))
//返回值是函数
def fun8(s:String):(String,String)=>String = {
def fun9(s1:String,s2:String):String={
s1+"\t"+s2+"\t"+s
}
fun9
}
println(fun8("aaa")("a","b"))
/**
* 柯里化函数
*/
def fun10(a:Int,b:Int)(c:Int,d:Int): Int ={
a+b+c+d
}
println(fun10(1, 2)(3, 4))
}
}
字符串和集合
字符串
- 与java相似
集合
Array
package scala.basic
import scala.collection.mutable.ArrayBuffer
object Array_demo {
def main(args: Array[String]): Unit = {
//默认不可变
//创建
val array: Array[String] = Array[String]("a","b","c")
val array2 = new Array[Int](5)//()中参数为Array长度,存在默认初始值
array2.foreach(println)
println("*******************")
//赋值
array2(0) = 10
array2(3) = 20
array2.foreach(println)
println("*******************")
//二维数组
val array3 = new Array[Array[Int]](3)
array3(0) = Array[Int](1,2,3)
array3(1) = Array[Int](1,2,3)
array3(2) = Array[Int](1,2,3)
for (i <- array3){
for (j <- i){
println(j)
}
}
//遍历
println("*******************")
array.foreach(println)
for(i <- array){
println(i)
}
//方法
//两个数组合并
val concat = Array.concat(array,array)
//初始化一个长度为5值为hello的数组
val fill = Array.fill(5)("HEllo")
//可变数组
val ab = new ArrayBuffer[Int](3)
ab.+=(10)
ab.+=:(100)
ab.foreach(println)
}
}
List
package scala.basic
import scala.collection.mutable.ListBuffer
object List_Deom {
def main(args: Array[String]): Unit = {
//创建
val ints: List[Int] = List(1,2,3)
//遍历
ints.foreach(println)
for (i <- ints){
println(i)
}
//过滤
val intsfilter = ints.filter(s => {
s == 1
})
intsfilter.foreach(println)
//返回符合条件的数据条数
val i = ints.count(_ >= 2)
println(i)
//可变list
val buffer = ListBuffer[Int](1,2,3)
buffer.foreach(println)
//追加元素
buffer.append(4,5,6)
}
}
Set
package scala.basic
object Set_Deom {
def main(args: Array[String]): Unit = {
//创建
val set1 = Set[Int](1,2,2,3,4,5,5,6)
//遍历
set1.foreach(println)
//方法
//交集
val set2 = Set[Int](2,3)
val result = set1.intersect(set2)
println(result)
//差集
val result2 = set1.diff(set2)
println(result2)
//操作符操作
//交集
val result3 = set1 & set2
println(result3)
//差集
val result4 = set1 &~ set2
println(result4)
//filter
val set3 = set1.filter(_ > 2)
set3.foreach(println)
//可变set
import scala.collection.mutable.Set
val set5 = Set[Int](1,2,3)
set5.+=(100)
}
}
Map
package scala.basic
object Map_Deom {
def main(args: Array[String]): Unit = {
//创建
val map = Map[Int,Int](1 -> 10,2 -> 20,(3,30),(3,40))
//相同的Key后面的会覆盖前面的
//遍历
for (i <- map){
println(i)
}
map.foreach(println)
//按键取值
val maybeInt: Int = map.get(1).get
println(maybeInt)
//当KEY的值可能不存在时
val result = map.get(1).getOrElse("null")
println(result)
//获取所有的KEY
val keys = map.keys
keys.foreach(key=>{
println(map.get(key).get)
})
//遍历所有的VALUE值
val values = map.values
values.foreach(println)
//map合并,合并时后面的KEY的值覆盖前面的
val map1 = Map[String,Int](("a",1),("b",2),("c",3))
val map2 = Map[String,Int](("a",4),("e",5),("d",6))
val inmap = map1.++(map2)
inmap.foreach(println)
//可变MAP
import scala.collection.mutable.Map
val map3 = Map[Int,Int]((1,1))
map3.put(2,3)
//filter
val filmap = map3.filter(x => {
x._1 == 1
})
filmap.foreach(println)
}
}
Tuple
package scala.basic
object Tuple_demo {
def main(args: Array[String]): Unit = {
//创建
val tuple1 = new Tuple1("hello")
val tuple2: (Int, Int) = new Tuple2(1,20)
val tuple3 = Tuple3(1,2,3)
val tuple4 = (1,2,3,4)
//Tuple最多22个元素
//元组使用 ._x 取值 x 表示第几个元素,下标从1开始
//遍历
val iterator = tuple4.productIterator
iterator.foreach(println)
//Tuple2 有 swap反转方法
}
}
Traitl
package scala.basic
trait Read {
def read(name:String): Unit = {
println(name)
}
}
trait Listen {
def listen(name:String): Unit = {
println(name)
}
}
/**
* trait可以有方法的实现也可以有方法的不实现
*/
trait equal{
def isequal(o:Any):Boolean
def isnoeq(o:Any):Boolean = !isequal()
}
class Point(x:Int,y:Int) extends equal {
val xx = x
val yy = y
override def isequal(o: Any): Boolean = {
o.isInstanceOf[Point]&&o.asInstanceOf[Point].xx == this.xx
}
}
//继承多个trait 第一个用 extends 后面的使用 with
class Person1() extends Read with Listen {
}
object Traitl_Demo {
def main(args: Array[String]): Unit = {
val person = new Person1()
person.read("zhangsan")
person.listen("lisi")
}
}
模式匹配|偏函数
package scala.basic
object model_demo {
def main(args: Array[String]): Unit = {
val tuple = (1,1.1,"abc",true,"a")
val iterator = tuple.productIterator
iterator.foreach(MatchTest(_))
//模式匹配可以匹配值还可以匹配类型
//匹配过程中存在数值的转换
//从上往下匹配,匹配上后会自动停止
def MatchTest(o:Any)={
o match {
case 1 => println("num is " + 1)
case i:Int => println("num "+i)
case s:String => println("String:"+ s )
case _ => println("no") // 默认匹配什么都匹配不上,放在最后
}
}
//偏函数
//[匹配值类型,返回值类型]
def myTest:PartialFunction[String,Int]={
case "abc" => 2
case "a" => 200
case _ => 404
}
val i = myTest("a")
println(i)
}
}
样例类
package scala.basic
//使用case关键字修饰的类就是样例类
case class p(name:String,age:Int){
//参数默认有getter和setter方法
//实现了toString,equals,copy和hashCode方法
}
object case_demo {
def main(args: Array[String]): Unit = {
val p1 = new p("zhangsan",10)
val p2 = new p("zhangsan",10)
println(p1.equals(p2))
}
}
字符串操作
- charAt(int index):返回指定位置的字符
- concat(String str):将指定字符串连接到此字符串的结尾
日期
val nowdate = LocalDate.now()
println("LocalDate.now()-->现在的时间是"+LocalDate.now())
println("nowdate.plusDays-->明天是-->"+nowdate.plusDays(1))
println("nowdate.minusDays-->昨天是-->"+nowdate.minusDays(1))
println("nowdate.plusMonths-->今天加一个月-->"+nowdate.plusMonths(1))
println("nowdate.minusMonths-->今天减一个月-->"+nowdate.minusMonths(1))
println("nowdate.getDayOfYear-->今天是今年的第"+nowdate.getDayOfYear+"天")
println("nowdate.getDayOfMonth->这个月有"+nowdate.getDayOfMonth+"天")
println("nowdate.getDayOfWeek-->今天星期"+nowdate.getDayOfWeek)
println("nowdate.getMonth-->这个月是"+nowdate.getMonth)
object Test_Time001 {
def main(args: Array[String]): Unit = {
// 获取今天日期
def getNowDate():String={
var now:Date = new Date()
var dateFormat = FastDateFormat.getInstance("yyyy-MM-dd")
var today = dateFormat.format( now )
today
}
// 获取昨天的时间
def getYesterday():String= {
var dateFormat = FastDateFormat.getInstance("yyyy-MM-dd")
var cal = Calendar.getInstance()
cal.add(Calendar.DATE, -1)
var yesterday = dateFormat.format(cal.getTime())
yesterday
}
// 获取本周开始日期
def getNowWeekStart():String={
var day:String=""
var cal:Calendar =Calendar.getInstance();
var df = FastDateFormat.getInstance("yyyy-MM-dd");
cal.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY)
//获取本周一的日期
day=df.format(cal.getTime())
day
}
// 获取本周末日期
def getNowWeekEnd():String={
var day:String=""
var cal:Calendar =Calendar.getInstance();
var df = FastDateFormat.getInstance("yyyy-MM-dd");
cal.set(Calendar.DAY_OF_WEEK, Calendar.SUNDAY);//这种输出的是上个星期周日的日期,因为老外把周日当成第一天
cal.add(Calendar.WEEK_OF_YEAR, 1)// 增加一个星期,才是我们中国人的本周日的日期
day=df.format(cal.getTime())
day
}
// 本月的第一天
def getNowMonthStart():String= {
var day: String = ""
var cal: Calendar = Calendar.getInstance();
var df = FastDateFormat.getInstance("yyyy-MM-dd");
cal.set(Calendar.DATE, 1)
day = df.format(cal.getTime()) //本月第一天
day
}
// 本月最后一天
def getNowMonthEnd():String={
var day:String=""
var cal:Calendar =Calendar.getInstance();
var df = FastDateFormat.getInstance("yyyy-MM-dd");
cal.set(Calendar.DATE, 1)
cal.roll(Calendar.DATE,-1)
day=df.format(cal.getTime())//本月最后一天
day
}
// 将时间戳转化成日期/时间
def DateFormat(time:String):String={
var sdf = FastDateFormat.getInstance("yyyy-MM-dd HH:mm:ss")
var date:String = sdf.format(new Date((time.toLong)))
date
}
// 计算时间差
def getCoreTime(start_time:String,end_Time:String)={
var df = FastDateFormat.getInstance("HH:mm:ss")
val begin = start_time
val end = end_Time
var between = (end.toLong - begin.toLong)/1000 //转化成秒
var minute = between % 60 //转化为分钟
val hour = between % (60*60) //转化为小时
}