其实我想找一门“具有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. 多看文档。
packagescalastudy.basicimportscala.collection.immutable.Listimportscala.collection.mutableimportscala.collection.mutable.{ArrayBuffer, Map, HashMap}importjava.io.File/*** Created by lovesqcc on 16-3-19.*/object WordStatextendsApp {
val seps= " -!\"#$%&()*,./:;[email protected][]^_`{|}~+<=>\\".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={returnfilename.endsWith(suffix)
}
def fetchAllJavaFiles(path:String): Array[String]={
val javaFilesBuf=ArrayBuffer[String]()
fetchJavaFiles(path, javaFilesBuf)returnjavaFilesBuf.toArray
}
def fetchJavaFiles(path:String, javafiles:ArrayBuffer[String]):Unit={
val dirAndfiles= newFile(path).listFilesif (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={importscala.io.Source
val fileSource=Source.fromFile(filename)try{returnfileSource.mkString
}finally{
fileSource.close()
}
}
def analysisWords(content:String):List[String]={returnsplitText(content, WordStat.seps);
}
def statWords(words: List[String]):Map[String,Int]={
val wordsMap= newHashMap[String,Int]
words.foreach { w=>wordsMap(w)= wordsMap.getOrElse(w,0) + 1}returnwordsMap
}
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)
}returninit.toList
}
def sortByValue(m: Map[String,Int]): Map[String,Int]={
val sortedm= newmutable.LinkedHashMap[String,Int]
m.toList.sortWith{case(kv1,kv2) => kv1._2 > kv2._2}.foreach { t =>sortedm(t._1)=t._2
}returnsortedm
}
}
原文:http://www.cnblogs.com/lovesqcc/p/5297268.html
本文介绍如何使用Scala编程语言实现Java项目的单词计数功能。Scala具备Python的简洁写法和Java平台的优势,本文通过具体示例展示了Scala的特性,如与Java互操作性、免分号语法、类型推断等,并提供了完整的代码实现。
402

被折叠的 条评论
为什么被折叠?



