scala语言基础

scala
-------------
java语言脚本化。
面向函数:直奔主题


直接写程序,直接运行即可。


java
-------------
javac  java
*.java  -------->  *.class   ------>  App


scalac scala
*.scala -------> *.class    -------> App


安装scala
----------------
1.准备jdk

2.安装scala
a.
b.
c.
d.




scala vs java
-------------------


进入scala shell
---------------
$>bin/scala
$scala>:help //查看帮助


o.getClass();


classOf(res6)
infer:;类型推断.


Int --> RichInt
Double --> RichDouble
Char --> RichChar




Long l = 100 ; //隐式转换
Short s = (Short)xxx //强转,显式转换




scala |java
-------------------------------------------
Int int + Integer
val(value) final:常量
var 可以修改(变量)
var x : String = "hello"
Any(任意) Object
1.toString()//自动1 ->Integer


1.to(10) //方法
1 to 10 //操作符


使用函数进行数据类型转换
var a:Int = 100 ;
var b:Short = 100 ;
b = (Short)a //error
b = a.toShort //ok


++ / -- //error,不支持
+= | -= //ok




函数 | 方法
---------------
函数:不需要通过类即可直接调用的方法。min power
import scala.math._ //_  === *
sqrt(2) //开发
pow(n) //几次方


单例对象
----------------


class Xxxx{
  ..
}


object Xxxx{

}


REPL : read + eval + print + loop


无参的函数使用时可以省略()
--------------------------
$scala>1.toString()
$scala>1.toString


apply
--------------------------
1.$scala>"hello"(4) //String.chatAt(i)
2.$scala>"hello".apply(4) //String.chatAt(i)
3.$scala>BigInt("1234") //BigInt.apply("1234567")






控制结构 + 函数
------------------------
1.条件表达式(if else)有值
2.三元运算符
...
val y = if (x > 0) 1 
val y = if (x > 0) 1 else () //()  == 不存在  Unit === void
3.进入shell的粘贴模式
$scala>:paste
$scala> //CTRL +D 


4.打印
println("hello")
print("hello")


5.从命令行输入读取数据
readLine("xxx") //字符串
readInt("age") //Int


6.循环
[while]
var i = 0 ;
while(i < 10){
i += 1
println(i)
}


[for]
for(i <- 1 to 10){
println(i)
}


for(i <- 1 until 10){println(i)}


1 to 10 //1,..,10
1 until 10 //1,..,9


Map + reduce
--------------
map() : 


scala  break操作,注意tab问题
------------------------------
import scala.util.control.Breaks._
breakable{
  for(i <- 1 to 10){
    if(i < 5) println(i) else break ;
  }
}


[a.scala]
$scala>load /home/ubuntu/a.scala




高级for循环,打印正三角9x9表格
-------------------------------
for(i <- 1 to 9 ; j <- 1 to 9 ){
  if(i >= j) print(i + " x " + j + " = " + (i * j) + "  ")
  if(j == i) println()
}




for推导式:  yield,循环期间,每次
产生新值放入集合中。将循环导出成向量。
-------------------------------
放弃,产生.
var x = for(i <- 1 to 10) yield i % 3
x: scala.collection.immutable.IndexedSeq[Int] = Vector(1, 2, 0, 1, 2, 0, 1, 2, 0, 1)


函数,递归函数必须声明返回类型。
---------------
[定义]
def fname(pname:ptype,) : retype = body
def add(a:Int,b:Int) : Int = a + b


[阶乘函数(循环方式)]
def fac(n:Int) = {
 var r = 1 ;
 for(i <- 1 to n) r = r * i
 r
}
[阶乘函数(递归方式)]
def fac(n:Int) : Int = {
 if(n == 1) 1 else fac(n-1)*n
}


fac(6) = 6 * fac(5) ==> 6 * 5 * fac(4) ==> .... => 


apply
----------------
"xxx"(4) //"xxx".apply(4)


默认参数值,带名参数
--------------------
public String xxx(String a,String b = "xxx"){
...
}


$scala>def dec(a:String,left:String = "[",right:String="]") :  String = left + a + right
$scala>var x = dec("tom") //x = [tom] //默认值
$scala>var x = dec(a="tom",right="###") //x = [tom] //指名参数




变长参数
-------------------
def sum(args:Int*) = {
var x = 0 ;
for(i <- args) r = r + i

}
$scala>var x = sum(1,2,3,4,5);
$scala>var x = sum(1 to 8) //error,类型不匹配
$scala>var x = sum(1 to 8: _*) //error,类型不匹配,将range转变成参数序列。


1 to n //Range区间,不是Seq。


def rsum(args:Int*):Int = {
if(args.length == 0) 0 
else args.head + rsum(args.tail:_*)
}


instanceof //
getClass() == Xxx.class //


过程,不返回值的函数,不使用 = 附作用.
----------------------
def box(name:String){
println("$$$" + name + "$$$")
}


def box(name:String): Unit = {
println("$$$" + name + "$$$")
}


lazy value:延迟求值
--------------------
$scala>lazy val x = scala.io.source.FromFile("/xx/x/x/").mkString //延迟求值
$scala>x








异常
--------------------
java : Throwable Error() + Exception(RuntimeException)
public void add(..) {
try{
_
}


catch(X1Exception e1){
e1
}
catch(X2Exception e2){
}
}

checked //待检
managed //托管


try{
...
}
catch{
case _  : XxxxException => xxx //进入xxx处理程序
case ex : XxxxException => ex.printStackTrace() //进入xxx处理程序
//越具体的异常越靠前
}


数组 + 缓冲区
-------------------
int[]
ByteBuffer


Array //定长
ArrayBuffer //变长


$scala>var x = new Array[Int](10) //0,0,0,0,0,..
$scala>var x = new Array[String](10) //null,null,..
$scala>var x = Array("hello","world") //
$scala>x(3) //方法数组元素




ArrayBuffer //数组缓冲区
$scala>scala.collection.mutable.ArrayBuffer
$>var x = ArrayBuffer[Int]()
$>x ++= Array(1,2,3) //使用++=操纵任何集合
$>x.trimEnd(5) //移除最有的n个元素
$>x.insert(2,3,4,5,6) //在2位置插入3...
$>x.remove(2,3) //从2开始移除,移除3个
$>x.remove(2) //x.remove(2,1)
$>buffer.toArray //从buffer到Array之间转换
$>array.toBuffer //..


$scala>for(i <- buffer | array) .. //遍历buffer|array

//yield遍历过程中,生成新的集合
$scala>for(i <- 1 to 5 if i % 2 == 0) yield i * 2 ; //先filter , 再 x 2产生新集合

$scala>var x = Array(1 to 5)


//内置函数
$scala>Array(1,2,3).sum


//缓冲区排序
$scala>y.sorted(_ < _) //????????????升序排序??????????????


//快速排序
$>var x = Array(1,7,2,9)
$scala>scala.util.Sorting.quickSort(a) //


//mkString
$scala>a.mkString(" and ")


多维数组
--------------
int[层][行][列] cube ; //java
Array[Array[Array[Int]]] //scala


$scala>var x = Array.ofDim[Int](3,3,3) //三维数组
$scala>var idx = 1 ;
for(i <- 0 until x.length){
for(j <- 0 until x(i).length){
for(k <- 0 until x(i)(j).length){
x(i)(j)(k) = idx ;
idx += 1
}
}
}


//使用不等长元素的多维数组
$scala>var x = new Array[Array[Int]](4)

java和scala的互操作
------------------------
ProcessBuilder builder = new ProcessBuilder();
List<String> list = new ArrayList<String>();
list.add("dir");
list.add("d:\\downloads");
Process p = builder.command(list).start();
InputStream is = p.getInputStream();

ByteArrayOutputStream baos = new ByteArrayOutputStream();
int len = 0 ;
byte[] buf = new byte[1024];
while((len = is.read(buf)) != -1){
baos.write(buf, 0, len);
}
is.close();
System.out.println(new String(baos.toByteArray()));




1.import scala.collection.JavaConversions.bufferAsJavaList
2.var cmd = ArrayBuffer("ls","-al","/home/ubuntu")
3.var pb = new ProcessBuilder(cmd); //自动转换



$scala>import scala.collection.JavaConversions.asScalaBuffer
$scala>import scala.collection.mutable.Buffer
$scala>var rr:Buffer[String] = pb.command




map + tuple
-------------------
1.java.util.Map
 java.util.HashMap
 java.util.TreeMap


2.var map = Map("001"->"tom","002"->"tomas","003"->"tomasLee") //scala 不可变
2.var map2 = Map(("001","tom"),("002","tomas"),("003","tomasLee")) //scala 不可变
3.var map = collection.mutable.Map("001"->"tom","002"->"tomas","003"->"tomasLee") //可变
4.map("001") //get
4.map.contais("001") //判断是否存在
4.map.getOrElse("001","nobody") //组合
4.map("001") = "xxx" //赋值
5.map2 - "004" //支持-


//迭代
5.scala>for((k,v) <- map) println(k + "-----" + v) //遍历


//java
map.keySet() //key集合
map.values() //value集合


//排序map
$scala>import scala.collection.immutable.SortedMap




//实现java和scala之间map的相互转换
$scala>var m : scala.collection.mutable.Map[String,String] = new java.util.TreeMap[String,String]




tuple
-----------------------
元组,Map是有两个元素的元组。
元组最多支持22元素
TupleX //tab可见
$scala>var t : Tuple3[Int,String,Int] = (1,"tom",12) //tuple
$scala>t._1 //n从1开始
$scala>val (id,name,age) = t
$scala>id
$scala>name
$scala>age


zip:咬合操作
-----------------------
两个数组的元素一一组合。
$scala>var ids = Array("001","002","003")
$scala>var names = Array("tom","tomas","tomasLee")
$scala>var pairs = ids.zip(names)



-------------
1.class Classname{
private var id = 0 ; //必须初始化,否则需要声明成abstract
 }
2.class Counter{
private var value = 0 ;
def increment() = value += 1
def current() = value
 }
3.getter和setter
getter //age
setter //age=
4.Dog //可以更加丰富的控制可见性
class Dog{
private[this] var age = 0
def addOne() = {age +=1}
def compare(b:Dog)={age < b.age}
}
5.scala.beans.BeanProperty
class Dog{
@BeanProperty private var age = 0 //生成getter / setter
def addOne() = {age +=1}
def compare(b:Dog)={age < b.age}
}
6.辅助构造函数
class Dog{
...
def this(name:String){
this() //主构造
this.name = name ; //赋值
}


def this(name:String,age:Int){
this(name)
this.age = age ;
}
}


如果主构造函数的参数使用了var或val,他们会生成对应的字段。
如果没有使用的话,但在方法中进行了访问,自动升级成字段。
7.java构造函数的第一条语句
class Dog{
public Dog(){
this(..) / super(...)
}
}


8.嵌套类(内部类)
class Car{
class Engine{
}
}
9.伴生对象
class + object(和class同名)


10.scala应用程序
a.编写scala文件
object Hello{
def main(args:Array[String]){
println("hello world")
}
}
b.编译scala文件
$>scalac hello.scala
c.运行
$>scala Hello




package / import
-------------------------
1.
2.
3.
4.
5.
6.








对象:object
--------------------
1.定义单例对象
[Box.scala]
object Box{
def getColor = "yellow"
}


[Box.class]
find class Box{
public static String getColor();

2.
3.






















class Counter{
private var value = 0 ;
def increment() = value += 1
def current() = value
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值