先丢两个网址,https://docs.scala-lang.org/tour/tour-of-scala.html https://twitter.github.io/effectivescala/index.html,前者是官网的入门文档,后者是推特给出的一些建议,英文水平好的同学可直接跳过去看。
scala类型图
与java类型对应关系
any->super class of primitive and object
AnyVal->primitive
Unit-> void
AnyRef-> Object
变量
java
int i = 0 ;
final String s = “hello, world”;
scala
var i:Int = 0
final val s:String = “hello, world”
scala 用var修饰变可变量,用val修饰不可变量,基类型为变量名后:变量类型
,不添加可自动推断,但加上阅读会更为清晰.
行末的;
号可省略.
方法
java
public T get(T t ){
return t;
}
scala
def get[T](t: T): T = t
一行是花括号可省略,最后返回时return可省略
类
java:
class A{
int a = 0 ;
String b = “hello, world”;
}
scala:
object Test {
val s = “hello, world”
}class Test {
val i = 0
}
scala中没有static关键字,java的class在scala中分解成了class与object,
所有静态方法和静态变量放在object中.
继承
- 接口实现和实现类继承统一使用 extends,即 implements改为extends
- 接口的interface关键字改为trait
- 重写方法是override为必需
- java.lang需要手动引入
不可用功能
- 三元静态式不支持 即
finalPoint = yourPoint == myPoint?myPoint:yourPoint
,可写成
finalPoint = if(yourPoint == myPoint)myPoint else yourPoint
continue
关键字不可用switch
用法改变,不用再break了.
a match{
case 1=>
println(“1”)
case 2=>
println(“2”)
case _=>
println(“)
}
了解以上后就可以像写java代码一样写scala代码了.
lambda 表达式
map
与flatMap
map
一对一映射
Array("1","2","3").map(x=>x.toInt)
,这里将"1","2","3"
字符串映射成数字1,2,3
flatmap
一对0到多的映射,Array("1", "23","45", "6","8890").flatMap(x =>{if (x.length > 1) x.split("").map(_.toInt).toList else if (x.length == 0) None else Some(x.toInt)})
reduce
Array(1,2,3,4,5).reduce((x,y)=>x+y)
Range(1,6).reduce((x,y)=>x+y)
(1 until 6).reduce((x,y)=>x+y)
implicit 隐式转换
"4321".toInt
就用到了隐式转换
给String提供append方法
implicit def toStringBuffer(s:String):java.lang.StringBuffer={
new java.lang.StringBuffer(s)
}
name parameter
以redis.clients.jedis.JedisPool
为例,共有约30个构造函数,最终大多都调到最长参数那个方法,其他都是提供了默认值,目的是为用户提供简单的调用方式
java
public Test(){this(DEFAULT_PARAM1,DEFAULT_PARAM2);}
public Test(Object param1){this(param1,DEFAULT_PARAM2);}
public Test(Object param1,Object param2){this.param1=param1; this.param2=param2;}
scala
def this(param1:AnyRef = DEFAULT_PARAM1,param2:AnyRef=DEFAULT_PARAM2)
调用
new Test
,new Test(param1="10086")
,new Test(param2="100010")
,new Test("10086","10010")