进阶之旅
掌握了基本的scala语法,能够用scala来替代java来完成编程,虽然代码的风格还是完全Java化的,但至少可以达到或者接近你之前的编码效率。这其实是一个不难的任务,是所有Java程序员首先要达到的程度。
然后,我们将进一步的熟悉Scala的一些进阶特性,这些特性可以进一步的提升你的代码质量。
使用 expression 来替代 statement。 在scala中,if, for, match 都是一个expression的。譬如:
val showFullName = true var name: String // 将 if/else作为 statement使用 if(showFullName) name = firstName + " " + lastName else name = firstName // 将if/else作为expression使用 val name = if(showFullName) firstName + " " + lastName else firstName // 将for作为statement使用 val origin = 0 to 10 var squres = new Array[Int](10) for(i <- origin){ squares(i) = origin(i) * origin(i) } // 将for作为表达式使用 val squares = for(i <- origin) yield origin(i) * origin(i) // 将match作为statement使用 val month = 2 var days: Int month match { case 1 => days = 31 case 2 => days = 28 case 3 => days = 31 ...... } // 将match作为expression使用 val days = month match { case 1 => 31 case 2 => 28 ...... }
其实,上面的几个例子都有一个共同点,使用expression替 statement后,都消除了var,而使用val替代。这其实是非常关键的一点。记住,var是邪恶的,真正的scala世界,不需要var。
学习 Collection API,掌握丰富的集合操作。 几乎所有的介绍函数式编程的语言,都会包括这样的例子:
val text = "a long string contains many words" val words = text.split("\\s+") .map(_.toLowerCase) .filter(NON_WORDS.contains(_)==false) .groupBy(identity) .foreach { case (word, array) => println("$word count:${array.size}") }
如果使用Java的模式来完成同样的功能,不仅代码量会膨胀很多倍,而且,可读性也会成为一个很大的问题。 而这也是函数式编程最为擅长的,在上面的例子中,map, filter, groupBy, foreach都是高阶函数,通过这些高阶函数的组合,数据以管道的方式从一个结算传递给另外一个计算,简洁而优美。
- map operation
- xs map f
- xs flatMap f
- xs collect f
- iteration
- xs foreach f
- filter & subcollections
- xs.head
- xs.tail
- xs.init
- xs take n
- xs drop n
- xs takeWhile p
- xs dropWhile p
- xs filter p
- xs filterNot p
- test
- xs forall p
- xs exists p
- xs count p
- Fold Operation
- xs foldLeft(z)(op)
- xs foldRight(z)(op)
- xs reduceLeft op
- xs reduceRight op
- xs.sum
- xs.product
- xs.min
- xs.max
scala的进阶之旅,熟练掌握上述的集合操作,并且能够在编程时,熟练的应用,消除一下传统的Java编程方式:
- 不再需要使用 for 或者 while 等传统的Java模式来处理集合。
- 不在需要使用 var 乃至 mutable collection来处理集合。
你会感觉到scala的强大、美妙,而且这样编写的代码,不仅简洁、易于阅读,而且,程序的Bug会显著减少,代码一次性正常通过的几率也会大幅度提升。
- map operation
继续学习如下的特性,并在工作中应用,以提高代码的可读性。
- case class
- pattern match
- trait mixing
不要轻易尝试如下特性。这些特性功能很强大,但也是导致scala背负着“宇宙最复杂的语言”的最重要的原因。我的建议是,不充许在应用层中使用,只充许在基础库中出现,并且编程者必需有一定的Scala水平级别。
- implicits
- type parameter(包括 协变、逆变、上届、下届、上下文界定、视图界定)
- 类型路径
- macro & scala reflect 事实上,只要不使用这些“复杂”的特性,scala会是一门非常简单的编程语言。
我们会在下一篇《怎么避免把Scala写成Java》中介绍你需要开始规避的一些Java惯性,只有这样,我们才能让我们的代码质量进一步的提升。