Scala初探(三)

11. curry化

<span style="font-family:KaiTi_GB2312;font-size:18px;"><strong>def inject(arr:Array[Int],initial:Int)(operation: (Int,Int) => Int): Int ={
	var carryOver = initial
	arr.foreach(element => carryOver = operation(carryOver,element))

	carryOver
}

val array = Array(2,3,5,1,6,4)
val sum = inject(array,0){
	(carryOver,elem) => carryOver + elem
}

println(sum)</strong></span>

curry化就是函数可以接受多个参数列表,比如上面的例子中就可以接受两个参数列表,而之前的例子都只有一个参数列表。如果要用同样的一组实参多次调用同一个函数,可以用curry化来减少噪音。

11.  set

<span style="font-family:KaiTi_GB2312;font-size:18px;"><strong>val color = Set("red","blue","green")
var colors = color

println(colors)

colors += "black"
println(colors)

val filterColors = color.filter(_ contains "red")
//mkString为Set的每个元素创建了其字符串表示,然后用逗号链接起来
println(filterColors.mkString(", "))

//两个集合合并使用 ++
//交集 **</strong></span>

12. 匹配

<span style="font-family:KaiTi_GB2312;font-size:18px;"><strong>def activity(day: String){
	day match{
		case "Sunday" => print("Eat,sleep,repeat...")
		case "Saturday" => print("Hangout with friends...")
		case "Monday" => print("...code for fun...")
		case "Friday" => print("...read a good book...")
	}
}

List("Monday","Sunday","Saturday").foreach{activity}</strong></span>

由于正则表达式在语言中区别不大,这里没有使用正则表达式的例子,直接使用字面匹配。

13. 文件读写

<span style="font-family:KaiTi_GB2312;font-size:18px;"><strong>import java.io._
import scala.io.Source

val writer = new PrintWriter(new File("data.txt"))
writer write "APPL\r"
writer.write("1234")
writer.close()

println("""The content of the file you read is:""" )
Source.fromFile("data.txt").foreach{print}</strong></span>


这里使用了java的io包

14. 网页读取

<span style="font-family:KaiTi_GB2312;font-size:18px;"><strong>import scala.io.Source
import java.net.URL

val source = Source.fromURL(new URL("http://www.scala-lang.org/docu/files/api/index.html"))

println(source.getLine(3))

val content = source.mkString
println(content)</strong></span>


15. XML

<span style="font-family:KaiTi_GB2312;font-size:18px;"><strong>//xml解析
val xmlFragment =
<symbols>
	<symbol ticker = "AAPL">
	<units>200</units></symbol>
	<symbol ticker = "IBM">
	<units>215</units></symbol>
</symbols>

//println(xmlFragment)
println(xmlFragment.getClass())

//这里是XML元素的\()方法,让它找出所有symbol元素,只能找出目标元素直接后代的元素
//val symbolNodes = xmlFragment.\("symbol")
val symbolNodes = xmlFragment \ "symbol"

//\\()可以找出目标元素结构里面的所有层次的元素
val unitsNodes = xmlFragment \\ "units"
println(unitsNodes(0).text)

println(symbolNodes.mkString("\n"))
//当成员函数没有参数时,括号可以去掉,下面两种方法都可以
println(symbolNodes.getClass)
println(symbolNodes.getClass())  

//use XML
println("Ticker\nUnits")
xmlFragment match {
	//使用_*把<symbols>和</symbols>之间所有的内容都读到占位符变量symbolNodes里
	case <symbols>{symbolNodes @ _*}</symbols> => for(symbolNode @ <symbol>{_*}</symbol> <- symbolNodes){
		println("%-7s%s".format(
			symbolNode \ "@ticker",(symbolNode \ "units").text))
	}
}

//解析xml文件
import scala.xml._

val stocksAndUnits = XML.load("stocks.xml")
println(stocksAndUnits.getClass())
println("Load file has " + (stocksAndUnits \\ "symbol").size + " symbol elements")

//写xml文件
import scala.xml._

val stocksAndUnits = XML.load("stocks.xml")
val stockAndUnitsMap =
(Map[String,Int]() /: (stocksAndUnits \ "symbol")){
	(map,symbolNode) => val ticker = (symbolNode \ "@ticker").toString
						val units = (symbolNode \ "units").text.toInt
						map(ticker) = units
						//creates and returns a new Map
}

val updatedStocksAndUnitsXML =
<symbols>
	{
		stockAndUnitsMap.map{
			updatedStocksAndUnitsXML
		}
	}
</symbols>

def updatedStocksAndCreateXML(element: (String,Int)) ={
	val (ticker,units) = element
	<symbols ticker = {ticker}>
		<units>{units + 1}</units>
	</symbols>
}

XML save ("stocks2.xml",updatedStocksAndUnitsXML)
println("The saved file contains " + (XML.load("stocks2.xml") \\ "symbols").size + " symbol elements")
</strong></span>

XML也是Scala的一等公民,所以不用“”,直接在代码中定义。

时间: 2024-10-09 20:36:50

Scala初探(三)的相关文章

scala学习三---文件里读取文本行

学习了scala的基本知识后,发现了scala是集函数式和指令式结合为一体的一种语言,代码更加简洁,但是对于用习惯了java的人来说,还真的不是一件易事~~ 今天学习scala脚本读取文本文件 列子如下: import scala.io.Source if(args.length>0){ for(line <- Source.fromFile(args(0)).getLines) print(line.length+" "+line) }else{ Console.err.

EF6.0+APS.NET MVC5.0项目初探三(code first实体映射到数据库)

到这里架构就搭建完了,该向里面填充东西的时候了,如上篇:EF6.0+APS.NET MVC5.0项目初探二(类库引用关系及说明) 第一步 :在需要添加EF的类库Domain.DbContext上右击->管理NuGet程序包->找到Entity FrameWork下载安装. 如图: 第二步:新建DbContext 第三步:在类库Domain.Entity上添加引用System.ComponentModel.DataAnnotations(用于验证的引用) 并新建实体类. 1 using Syst

JavaScript初探三

<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title></title> </head> <body> <ul id

Scala学习(三)----数组相关操作

数组相关操作 摘要: 本篇主要学习如何在Scala中操作数组.Java和C++程序员通常会选用数组或近似的结构(比如数组列表或向量)来收集一组元素.在Scala中,我们的选择更多,不过现在我们先假定不关心其他选择,而只是想马上开始用数组.本篇的要点包括: 1. 若长度固定则使用Array,若长度可能有变化则使用ArrayBuffer 2. 提供初始值时不要使用new 3. 用()来访问元素 4. 用for (elem<-arr)来遍历元素 5. 用for (elem<-arr if…)…yie

JavaScript初探 三

<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title></title> </head> <body> <input

Scala学习(三)练习

Scala数组相关操作&练习 1. 1. 编写一段代码,将a设置为一个包含n个随机整数的数组,要求随机数介于0(包含)和n(不包含)之间 def main (args: Array[String]) { createArr(10).foreach(println)}def createArr(n:Int):Array[Int]={ val arr=new Array[Int](n) val rand=new Random() for(ele <- arr) yield rand.nextIn

scala初探(一)

Scala语言是在JVM上编程的优秀语言之一,其为并发,表达式和可扩展性而设计.这门语言及其程序库可以让你专注于问题而无需深陷于线程和同步等底层基础结构细节.Scala是一门混合了函数式和面向对象的语言.有以下特性: 1. Scala对函数式编程的支持可以写出非常简洁而有表现力的代码: 2. 对于多线程应用,Scala提供了基于actor的消息传递模型,消除了涉及并发的痛苦问题,利用该模型,可以很方便简单的写出多线程代码,而不用考虑线程之间的数据竞争和加锁释放锁等问题: 3. Scala和jav

Scala初探(二)

5. 单例模式 <span style="font-family:KaiTi_GB2312;font-size:18px;"><strong>class Marker(val color: String){ //类中的任何代码段作为构造函数的一部分 println("Creating " + this) override def toString(): String = "marker color " + color }

快学Scala 第三课 (定长数组,变长数组, 数组循环, 数组转换, 数组常用操作)

定长数组定义: val ar = new Array[Int](10) val arr = Array("aa", "bb") 定长数组赋值: arr(0) = "cc" 变长数组定义: val ab = new ArrayBuffer[String]() val ab1 = ArrayBuffer[String]() 定长数组增加元素: ab += "aa" ab += ("bb", "cc&q