其实我想找一门“具有Python的简洁写法和融合Java平台的优势, 同时又足够有挑战性和灵活性”的编程语言。 Scala 就是一个不错的选择。本文使用 Scala 实现 Java 项目的单词计数。
Scala 一些特点:
1. 可以容易地与 Java 互操作;
2. 不必写分号;
3. 属性在前,类型在后; “先思考模型,后确定类型” 的思想;
4. 无参函数调用只用写函数名,不必写()
5. 常用结合: Array, ArrayBuffer, mutable.List, immutable.List, mutable.Map, mutable.HashMap, immutable.HashMap, Tuple
访问 Array 或 Map , 使用 array(0) = "xxx" 或 map("key") = "value" ; 访问 Tuple 使用 ._1, ._2, ... 第一个索引为一
6. 使用 map, filter 方法进行映射或过滤处理; 组合起来很强大!
7. 使用 iter.foreach { e => func(e) } 进行遍历处理;
8. 使用 object YourAPP extends App { //code } 实现 Main 函数 。
9. 多看文档。
package scalastudy.basic import scala.collection.immutable.List import scala.collection.mutable import scala.collection.mutable.{ArrayBuffer, Map, HashMap} import java.io.File /** * Created by lovesqcc on 16-3-19. */ object WordStat extends App { val seps = " -!\"#$%&()*,./:;?@[]^_`{|}~+<=>\\".toArray launch() def launch(): Unit = { val path = "/home/lovesqcc/work/java/ALLIN/src/main/java/" val files = fetchAllJavaFiles(path) //files.foreach { println } val allWords = files.map(readFile(_)).map(analysisWords(_)).flatten.toList sortByValue(statWords(allWords)).map(println) } def fileJavaFile(filename:String, suffix:String): Boolean = { return filename.endsWith(suffix) } def fetchAllJavaFiles(path:String): Array[String] = { val javaFilesBuf = ArrayBuffer[String]() fetchJavaFiles(path, javaFilesBuf) return javaFilesBuf.toArray } def fetchJavaFiles(path:String, javafiles:ArrayBuffer[String]):Unit = { val dirAndfiles = new File(path).listFiles if (dirAndfiles.length > 0) { val files = dirAndfiles.filter(_.isFile) if (files.length > 0) { javafiles ++= files.map(_.getCanonicalPath).filter(fileJavaFile(_,".java")) } val dirs = dirAndfiles.filter(_.isDirectory) if (dirs.length > 0) { dirs.map(_.getCanonicalPath).foreach { dirpath => fetchJavaFiles(dirpath, javafiles) } } } } def readFile(filename:String): String = { import scala.io.Source val fileSource = Source.fromFile(filename) try { return fileSource.mkString } finally { fileSource.close() } } def analysisWords(content:String):List[String] = { return splitText(content, WordStat.seps); } def statWords(words: List[String]):Map[String,Int] = { val wordsMap = new HashMap[String,Int] words.foreach { w => wordsMap(w) = wordsMap.getOrElse(w,0) + 1 } return wordsMap } def splitText(text:String, seps:Array[Char]): List[String] = { var init = Array(text) seps.foreach { sep => init = init.map(_.split(sep)).flatten.map(_.trim).filter(s => s.length > 0) } return init.toList } def sortByValue(m: Map[String,Int]): Map[String,Int] = { val sortedm = new mutable.LinkedHashMap[String,Int] m.toList.sortWith{case(kv1,kv2) => kv1._2 > kv2._2}.foreach { t => sortedm(t._1) = t._2 } return sortedm } }
原文:http://www.cnblogs.com/lovesqcc/p/5297268.html