hangscer

Scala步入正轨

2017/02/11

3.Scala步入正轨

3.2 Java基本类型对应的Scala类

Scala一切都是对象。比如Scala编译器会把Scala.Int当作Java的基本类型int。不会由于装箱带来性能不足。当对Int调用类似to()这样用法是,当Scala确定Int无法满足需求时,会应用intWrapper()方法把Int转化为scala.runtime.RichInt,然后调用它的to()方法。诸如RichIntRichDoubleRichBoolean之类的类,叫做富封装类。

3.4字符串与多行原始字符串

Scala可以自动把String转化为scala.runtime.RichString——这样可以无缝使用诸如capitalize()lines()、和reverse等便捷的方法。

1
2
"mom".reverse=="mom"
"mom".reverse.toString=="mom"

3.5 自适应的默认做法

默认情况下,Scala会导入两个包和scala.Predef对象。

  • java.lang
  • scala
  • scala.Predef

    3.6 运算符重载

    Scala没有运算符,重载的指的是以这样的命名的方法。Scala没有运算符,则它的运算符优先级别该如何定义?Scala以方法的优先级解决这一矛盾。 方法名的第一个字符决定了它的优先级。下面从低到高列出了首字符的优先级:
  1. |
  2. ^
  3. &
  4. < >
  5. = !
  6. :
  7. + -
  8. * / %
  9. 所有其他特殊字符

    3.7 Scala带给Java程序员的惊奇

    3.7.1 赋值的结果

    在Scala中,赋值结果(a=b)的结果是Unit。在Java中,赋值(a=b)的结果是a的值。

    3.7.2 Scala中的==

    Scala对==的处理不同于Java。Scala对所有类型的处理都是一致。无论是什么类型,==都是基于值的比较。这点由Any类(Scala所有类都由此派生而来)把==()还是调用equals实现成final得到保证。

因此,如果想为某个类的对比方法提供特定的实现,就要改写equalseq方法基于身份的比较(引用比较)。

3.7.3 分号是半可选的

然而,Scala需要在{之前有个分号,不然让你吃惊😱。
这里不加分号 Scala创建派生ArrayList[Int]的匿名内部类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
val list1=new java.util.ArrayList[Int];
{
println("Created list1")
}
val list2=new java.util.ArrayList[Int]
{
println("Created list2")
}
println(list1.getClass)
println(list2.getClass)
//console
//Created list1
//Created list2
//class java.util.ArrayList
//class nathan.HelloWord$$anon$1

3.7.5 默认的访问修饰符以及如何修改

默认,Scala把类、字段和方法当作public。当然,可以手动改为privateprotected

3.7.8 避免显式return

Scala见到return跳出方法。至少它会影响到Scala推演返回类型的能力。

如果使用return,必须显示说明返回值类型。

1
2
3
4
//显式return 必须指明返回值类型
def check1:Boolean = return true
//Scala类型推演 无需指明返回值类型
def check2 = true