trait(特质)未被实现的方法,默认就是抽象的
trait Logger { def log(message: String) // like an abstract method }
implementing of derived class
class CosoleLogger extends Logger { def log(message: String) { println(message) } // 可不需要override }
注意: 当特质改变时, 有被mix-in的类都必须重新编译。
在scala中应避免使用foreach,foreach没有返回值也就是Unit,在函数式编程中不返回任何结果的操作,很有可能进行有副作用的操作.
for ( x <- 1 to 5 ) { // 无法返回任何值 println(x) } //等同于foreach (1 to 5).foreach { x=> //无法返回任何值 println(x) }
yield在scala中与c#意义完全不同,yield相当于c#中的select加上toList. 或toArray等等,是List还是Array这取决于原来的集合对象类型.
map方法的作用很大,可将原来的值或对象进行转换或运算成另一个结果,特别是搭配Option[A]后在处理Null的问题上起了很大的作用,后面会提到.
for ( x <- 1 to 5 ) yield x
res51: scala.collection.immutable.IndexedSeq[Int] = Vector(1, 2, 3, 4, 5) //等同于map (1 to 5).map(x => x)
res52: scala.collection.immutable.IndexedSeq[Int] = Vector(1, 2, 3, 4, 5)
//结论:返回的结果res51和res52无二致