# 1. 与Java的互操作性
Scala与Java有很好的互操作性。可以在Scala项目中直接使用Java类库,也可以将Scala代码编译后供Java项目使用。例如,一个Java框架可以轻松地集成Scala编写的代码模块。
# 2. 强大的集合库
Scala拥有功能丰富的集合库。像List、Set、Map等集合类型有很多实用的操作方法。例如,可以使用flatten方法将嵌套的集合扁平化为一个层次的集合。
```scala
val nestedList = List(List(1, 2), List(3, 4))
val flatList = nestedList.flatten
```
# 3. 匿名函数
Scala中匿名函数使用广泛。匿名函数简洁地表示了无需单独命名的函数逻辑。
```scala
val double = (x: Int) => x * 2
```
# 4. 默认参数
Scala支持函数参数的默认值设定。定义函数时可以给参数设置默认值,调用函数时如果不传入该参数则使用默认值。
```scala
def greet(name: String = "Guest") = println(s"Hello, $name!")
```
# 5. 字符串插值
Scala提供了方便的字符串插值方式。在双引号前加上`s`,就可以在字符串中嵌入变量或表达式的求值结果。
```scala
val num = 10
val str = s"The number is $num"
```
# 6. 包对象
可以定义包对象来存放包级别的属性和方法,而不是把这些内容分散在不同的类或者单例对象中。
```scala
package object mypackage {
val commonValue = 100
def commonFunction() = println("Common function in package")
}
```
# 7. 操作符重载
Scala允许对操作符进行重载。很多情况下,操作符只是特殊方法名的一种简洁写法。例如,可以定义自己版本的加法操作符。
```scala
class MyNumber(val value: Int) {
def +(other: MyNumber) = new MyNumber(value + other.value)
}
```
# 8. 类型别名
可以使用type关键字定义类型别名,这使得复杂的类型可以使用一个简化的名称在代码中表示。
```scala
type MyIntList = List[Int]
```
# 9. 尾递归优化
Scala会对尾递归函数进行优化,避免创建大量中间栈帧。当编写递归函数且递归调用是函数的最后一个操作时,可以利用尾递归优化性能。
```scala
def factorial(n: Int, acc: Int = 1): Int = {
if (n <= 1) acc
else factorial(n - 1, n * acc)
}
```
# 10. 单例对象
使用object关键字可以定义单例对象。单例对象在整个程序中只有一个实例,可以用于保存全局状态或者作为工具类。
```scala
object MyLogger {
def log(message: String) = println(s"LOG: $message")
}
```