使用Scala
1. 净资产应用实例
我们要构建这样一个应用,它会取回一份列表,其中包括用户持有的股票的代码以及股份,并告知他们在当前日期为止的这些投资的总价。这包含了几件事:获取用户输入、读文件、解析数据、写文件、从Web获取数据、把信息显示给用户。
我们会先开发一个控制台应用。然后,把它转换成Swing应用。一次一步,沿着这条路重构应用。
2. 获取用户输入
Scala的Console类可以从命令行获取用户输入。
下面的代码将信息读入内存:
package com.cn.gao
//获取用户输入
class ConsoleInput {
print("Please enter a tiker symbol:")
val symbol = Console.readLine
//val symbol = readLine //This will work too
println("OK, got it, you own " + symbol)
}
//object ConsoleInput extends App{
// new ConsoleInput()
//}
程序运行结果如下:
Please enter a tiker symbol:AAPL
OK, got it, you own AAPL
3. 读写文件
用java.io.File可以做这件事。下面是个写文件的例子:
package com.cn.gao
import java.io._
//写文件
class WriteToFile {
val writer = new PrintWriter(new File("D:\\symbols.txt"))
writer write "AAPL"
writer.close()
} //object WriteToFile extends App{
// new WriteToFile()
//}
上面的这段代码将股票代码"AAPL"写入到文件D:\\symbols.txt里。文件内容如下:
AAPL
读文件写真的很简单。Scala的Source类及其伴生对象就是为这种目的而存在的。为了演示,我们写了一个Scala脚本:
package com.cn.gao
import scala.io.Source
/**
* 读文件
*/
class ReadingFile {
println("请输入你要读出的文件完整路径:")
val name = readLine //或者Console.readLine
Source.fromFile(name).foreach(print)
} object ReadingFile extends App{
new ReadingFile()
}
在上面的代码里,读取了相应的文件,打印出其内容如下所示:
请输入你要读出的文件完整路径:
D://data.txt
linux的特点
1.免费的/开源
2.支持多线程./多用户的
3.安全性好
4.对内存和文件管理优越. linux最小只需要4m->嵌入式开发
samba服务器用于和windows进行交互
从事网络开发必读三本书:
TCP/ip详解,协议
实现
TCP事务协议 http nntp和UNIX域协议
tracert 目标ip/域名 查看经过的网关数目(追踪路由)
ping 目标ip 测试两个ip是否畅通
1.在windows中查看ip情况的命令是ipconfig
2.在linux/unix下查看ip命令是ifconfig
linux网络环境配置
第一种方法:
(1)用root身份登录,运行setup命令进入到text mode setup utiliy对
网络进行配置。这里可以进行ip,子网掩码,默认网关,dns的设置。
(2)这时网卡配置没有生效,运行/etc/rc.d/init.d/network restart命
令我们刚才作的设置生效
第二种方法:
(1)ifconfig eth0 x.x.x.x对网卡进行设置
(2)ifconfig eth0 network x.x.x.x对子网掩码设置
对广播地址和dns使用默认的。
注意:这样配置网络将会立即生效,但是是临时生效。
第三种方法:
(1)修改/etc/sysconfig/network-scripts/ifconfig-eth0这个文件里各个
属性可以修改,包括ip,子网掩码,广播地址,默认网关。
(2)这时网卡的配置没有生效,运行/etc/rc.d/init.d/network restart
命令我们刚才作的设置才生效。
这种方法是最底层的修改方法
samba的安装步骤
a.看看是否已经安装了samba
rpm -q samba
b.如有,如何卸载
rpm -e samba
rpm -e --nodeps samba http://blog.csdn.net/eric491179912/article/details/6179908
Source类是一个输入流上的Iterator。Source的伴生对象有几个便利方法去读文件、输入流、字符串甚至是URL,稍后会看到。foreach()方法一次读取一个字符(输入是缓冲的,不必担心性能)。如果需要一次读一行,那就用getLines()方法。
很快我们就会从Web读信息了。因此,讨论Source时,让我们看看它的fromURL()方法。这个方法可以读取网站、web服务或是任何可以用URL指向东西的内容。下面是个例子,读入Scala文档站点,确定文档相关的Scala版本号:
package com.cn.gao
import scala.io.Source
import java.net.URL
/**
* 从Web读取信息
*/
class ReadingURL {
val source = Source.fromURL(
new URL("http://www.scala-lang.org/docu/files/api/index.html")) println(source.getLine(3))
val content = source.mkString
val VersionRegEx = """[\D\S]+scaladoc\s+\(version\s+(.+)\)[\D\S]+""".r
content match {
case VersionRegEx(version) => println("Scala doc for version: " + version)
}
} object ReadingURL extends App{
new ReadingURL()
}
上面的代码调用fromURL()获得Source实例,这样,就可以从URL读取内容,然后进行迭代。将3传入getLine()方法,读取第三行。使用这个方法必须小心谨慎。索引值从1开始,而不是0,所以,第一行实际上是用索引1引用的。
4. XML,作为一等公民
Scala把XML当作一等公民。因此,不必把XML文档嵌入字符串,直接放入代码即可,就像放一个int或Double值一样。看个例子:
package com.cn.gao
import scala.xml._
class UseXML {
val xmlFragment =
<symbols>
<symbol ticker="AAPL"><units>200</units></symbol>
<symbol ticker="IBM"><units>215</units></symbol>
</symbols>
println(xmlFragment)
println(xmlFragment.getClass())
} object UseXML extends App {
new UseXML()
}
这里创建了一个val,叫做xmlFragment,直接把一些XML样例内容赋给它。Scala解析了XML的内容,欣然创建了一个scala.xml.Elem的实例,输出如下:
<symbols>
<symbol ticker="AAPL"><units>200</units></symbol>
<symbol ticker="IBM"><units>215</units></symbol>
</symbols>
class scala.xml.Elem
Scala的scala.xml包提供了一些类,用以读取、解析、创建和存储XML文档。
你或许用过XPath,它提供了一种强大的查询XML文档的方式。Scala提供了一种类似XPath的查询能力,但略有差异。对于辅助解析和提取的方法,Scala不用斜线(/和//)查询,而用反斜线(\和\\)。这个差异是必需的,因为Scala遵循Java的传统,使用两个斜线表示注释。这样,我们看一下如何解析手头上的这个XML片段。
首先,要获取symbol这个元素。为了做到这一点,可以使用类似XPath的查询,如下:
package com.cn.gao
import scala.xml._
class UseXML {
val xmlFragment =
<symbols>
<symbol ticker="AAPL"><units>200</units></symbol>
<symbol ticker="IBM"><units>215</units></symbol>
</symbols>
// println(xmlFragment)
// println(xmlFragment.getClass())
var symbolNodes = xmlFragment \ "symbol"
println(symbolNodes.mkString("\n"))
println(symbolNodes.getClass())
} object UseXML extends App {
new UseXML()
}
上面的代码的输出如下:
<symbol ticker="AAPL"><units>200</units></symbol>
<symbol ticker="IBM"><units>215</units></symbol>
class scala.xml.NodeSeq$$anon$1
这里调用了XML元素的\()方法,让它找到所有symbol元素。它会返回一个scala.xml.NodeSeq的实例,表示XML节点的集合。
\()方法只会找出是目标元素(本例子里是symbols元素)直接后代的元素。如果想从目标元素出发,搜出层次结构里所有的元素,就要用\\()方法,如下所示。此外,用text()方法可以获取元素里的文本节点。
package com.cn.gao
import scala.xml._
class UseXML {
val xmlFragment =
<symbols>
<symbol ticker="AAPL"><units>200</units></symbol>
<symbol ticker="IBM"><units>215</units></symbol>
</symbols>
// println(xmlFragment)
// println(xmlFragment.getClass()) // var symbolNodes = xmlFragment \ "symbol"
// println(symbolNodes.mkString("\n"))
// println(symbolNodes.getClass()) var unitsNodes = xmlFragment \\ "units"
println(unitsNodes.mkString("\n"))
println(unitsNodes.getClass())
println(unitsNodes(0).text)
} object UseXML extends App {
new UseXML()
}
上面的代码的输出如下:
<units>200</units>
<units>215</units>
class scala.xml.NodeSeq$$anon$1
200
在上面的例子里,使用了text()方法去获取文本节点。模式匹配也可以获取文本值以及其他内容。如果想浏览XML文档的结构,\()和\\()两个方法很有用。不过,如果想匹配XML文档任意位置的内容,模式匹配会显得更有用。
Scala也将模式匹配扩展到了XML片段的匹配上,如下所示:
package com.cn.gao
import scala.xml._
class UseXML {
val xmlFragment =
<symbols>
<symbol ticker="AAPL"><units>200</units></symbol>
<symbol ticker="IBM"><units>215</units></symbol>
</symbols>
// println(xmlFragment)
// println(xmlFragment.getClass()) // var symbolNodes = xmlFragment \ "symbol"
// println(symbolNodes.mkString("\n"))
// println(symbolNodes.getClass()) var unitsNodes = xmlFragment \\ "units"
// println(unitsNodes.mkString("\n"))
// println(unitsNodes.getClass())
// println(unitsNodes(0).text) unitsNodes(0) match {
case <units>{numberOfUnits}</units> => println("Units: " + numberOfUnits)
}
} object UseXML extends App {
new UseXML()
}
上面代码的输出如下:
Units: 200
这里,取出第一个units元素,让Scala提取出文本值200。在case语句里,我们对感兴趣的片段进行匹配,用一个变量numberOfUnits,当做这个元素的文本内容的占位符。
这样就可以获取到一支股票的股份了。不过还是有两个问题。前一种方式只对内容刚好匹配case里表达式的情况起作用;也就是说,units元素只能包含一个内容项或是一个子元素。如果它包含的是子元素和文本内容的混合体,上面的匹配就会失败。而且这里想得到的是所有股票的股份,而不是第一个。运用_*,就可以让Scala抓出所有的内容(元素和文本),如下所示:
package com.cn.gao
import scala.xml._
class UseXML {
val xmlFragment =
<symbols>
<symbol ticker="AAPL"><units>200</units></symbol>
<symbol ticker="IBM"><units>215</units></symbol>
</symbols>
// println(xmlFragment)
// println(xmlFragment.getClass()) // var symbolNodes = xmlFragment \ "symbol"
// println(symbolNodes.mkString("\n"))
// println(symbolNodes.getClass()) var unitsNodes = xmlFragment \\ "units"
// println(unitsNodes.mkString("\n"))
// println(unitsNodes.getClass())
// println(unitsNodes(0).text) // unitsNodes(0) match {
// case <units>{numberOfUnits}</units> => println("Units: " + numberOfUnits)
// } println("Ticker\tUnits")
xmlFragment match {
case <symbols>{symbolNodes @ _*}</symbols> =>
for(symbolNode @ <symbol>{_*}</symbol> <- symbolNodes){
println("%-7s %s".format(
symbolNode \ "@ticker", (symbolNode \ "units").text)) //用@前缀表示属性查询
}
}
} object UseXML extends App {
new UseXML()
}
上面代码的输出如下:
Ticker Units
AAPL 200
IBM 215
5. 读写XML
只有将XML读入内存,才能够进行解析。下一步,我们来了解如何将XML文档加载到程序里,如何把内存里的文档存入文件。作为例子,我们会加载一个包含股票代码和股份的文件,对股份加1,然后将更新的内容存回到另一个XML文件里。我们先来处理加载文件的这一步。
这是要加载的样例文件stocks.xml:
<symbols>
<symbol ticker="AAPL"><units>200</units></symbol>
<symbol ticker="ADBE"><units>125</units></symbol>
<symbol ticker="ALU"><units>150</units></symbol>
<symbol ticker="AMD"><units>150</units></symbol>
<symbol ticker="CSCO"><units>250</units></symbol>
<symbol ticker="HPQ"><units>225</units></symbol>
<symbol ticker="IBM"><units>215</units></symbol>
<symbol ticker="INTC"><units>160</units></symbol>
<symbol ticker="MSFT"><units>190</units></symbol>
<symbol ticker="NSM"><units>200</units></symbol>
<symbol ticker="ORCL"><units>200</units></symbol>
<symbol ticker="SYMC"><units>230</units></symbol>
<symbol ticker="TXN"><units>190</units></symbol>
<symbol ticker="VRSN"><units>200</units></symbol>
<symbol ticker="XRX"><units>240</units></symbol>
</symbols>
scala.xml的XML单例对象的load()方法可以辅助加载文件,如下所示:
package com.cn.gao
import scala.xml._
class ReadWriteXML {
val stocksAndUnits = XML.load("D:\\stocks.xml")
println(stocksAndUnits.getClass())
println("Loaded file has " + (stocksAndUnits \\ "symbol").size +
" symbol elements")
} object ReadWriteXML extends App {
new ReadWriteXML()
}
从下面的输出可以看出,load()返回的是一个scala.xml.Elem实例。此外还可以看到,加载的文件(stocks.xml)包含15个symbol元素。
class scala.xml.Elem
Loaded file has 15 symbol elements
我们已经知道如何解析这个文档的内容,下面将股票代码以及其对应的股份存到Map里。下面这段代码做的就是这件事:
package com.cn.gao
import scala.collection.mutable._
import scala.xml._
class ReadWriteXML {
val stocksAndUnits = XML.load("D:\\stocks.xml")
// println(stocksAndUnits.getClass())
// println("Loaded file has " + (stocksAndUnits \\ "symbol").size +
// " symbol elements") val stocksAndUnitsMap =
(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
}
println("Number of symbol elements found is " + stocksAndUnitsMap.size)
} object ReadWriteXML extends App {
new ReadWriteXML()
}
最后一步,增加股份值,创建数据的XML表示,存入文件。
package com.cn.gao
import scala.collection.mutable._
import scala.xml._
class ReadWriteXML {
val stocksAndUnits = XML.load("D:\\stocks.xml")
// println(stocksAndUnits.getClass())
// println("Loaded file has " + (stocksAndUnits \\ "symbol").size +
// " symbol elements") val stocksAndUnitsMap =
(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
}
println("Number of symbol elements found is " + stocksAndUnitsMap.size) val updatedStocksAndUnitsXML =
<symbols>
{ stocksAndUnitsMap.map{ updateUnitsAndCreateXML }}
</symbols> def updateUnitsAndCreateXML(element : (String, Int))= {
val (ticker, units) = element
<symbol ticker={ticker}>
<units>{units + 1}</units>
</symbol>
} XML save ("D:\\stocks2.xml", updatedStocksAndUnitsXML)
println("The saved file contains " +
(XML.load("D:\\stocks2.xml") \\ "symbol").size = " symbol elements")
} object ReadWriteXML extends App {
new ReadWriteXML()
}
6. GUI使用示例
package com.cn.gao
import scala.swing._
import event._
object SampleGUI extends SimpleSwingApplication {
def top = new MainFrame {
title = "A Sample Scala Swing GUI" val label = new Label {text = "------------"}
val button = new Button { text = "Click me"} contents = new FlowPanel {
contents += label
contents += button
} listenTo(button) reactions += {
case ButtonClicked(button) =>
label.text = "You clicked!"
}
}
}
使用Scala的更多相关文章
- jdb调试scala代码的简单介绍
在linux调试C/C++的代码需要通过gdb,调试java代码呢?那就需要用到jdb工具了.关于jdb的用法在网上大家都可以找到相应的文章,但是对scala进行调试的就比较少了.其实调试的大致流程都 ...
- scala练习题1 基础知识
1, 在scala REPL中输入3. 然后按下tab键,有哪些方法可以被调用? 24个方法可以被调用, 8个基本类型: 基本的操作符, 等: 2,在scala REPL中,计算3的平方根,然 ...
- 牛顿法求平方根 scala
你任说1个整数x,我任猜它的平方根为y,如果不对或精度不够准确,那我令y = (y+x/y)/2.如此循环反复下去,y就会无限逼近x的平方根.scala代码牛顿智商太高了println( sqr(10 ...
- Scala集合和Java集合对应转换关系
作者:Syn良子 出处:http://www.cnblogs.com/cssdongl 转载请注明出处 用Scala编码的时候,经常会遇到scala集合和Java集合互相转换的case,特意mark一 ...
- Scala化规则引擎
1. 引言 什么是规则引擎 一个业务规则包含一组条件和在此条件下执行的操作,它们表示业务规则应用程序的一段业务逻辑.业务规则通常应该由业务分析人员和策略管理者开发和修改,但有些复杂的业务规则也可以由技 ...
- Scala快速概览
IDEA工具安装及scala基本操作 目录 一. 1. 2. 3. 4. 二. 1. 2. 3. 三. 1. 2. 3. 4. 5. 6. 7. 四. 1. (1) (2) (3) (4) (5) ( ...
- Scala Macros - scalamela 1.x,inline-meta annotations
在上期讨论中我们介绍了Scala Macros,它可以说是工具库编程人员不可或缺的编程手段,可以实现编译器在编译源代码时对源代码进行的修改.扩展和替换,如此可以对用户屏蔽工具库复杂的内部细节,使他们可 ...
- Scala Macros - 元编程 Metaprogramming with Def Macros
Scala Macros对scala函数库编程人员来说是一项不可或缺的编程工具,可以通过它来解决一些用普通编程或者类层次编程(type level programming)都无法解决的问题,这是因为S ...
- Scala Reflection - Mirrors,ClassTag,TypeTag and WeakTypeTag
反射reflection是程序对自身的检查.验证甚至代码修改功能.反射可以通过它的Reify功能来实时自动构建生成静态的Scala实例如:类(class).方法(method).表达式(express ...
- Scala For Java的一些参考
变量 String yourPast = "Good Java Programmer"; val yourPast : String = "Good Java ...
随机推荐
- 59. 螺旋矩阵 II
给定一个正整数 n,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的正方形矩阵. 示例: 输入: 3 输出: [ [ 1, 2, 3 ], [ 8, 9, 4 ], [ 7, 6, ...
- 1017 Queueing at Bank (25)(25 point(s))
problem Suppose a bank has K windows open for service. There is a yellow line in front of the window ...
- 递归与分治策略之循环赛日程表Java实现
递归与分治策略之循环赛日程表 一.问题描述 设有n=2^k个运动员要进行网球循环赛.现要设计一个满足以下要求的比赛日程表: (1)每个选手必须与其他n-1个选手各赛一次: (2)每个选手一天只能参赛一 ...
- BZOJ 1283 序列 费用流 网络流 线性规划
https://darkbzoj.cf/problem/1283 给出一个长度为N的正整数序列Ci,求一个子序列,使得原序列中任意长度为M的子串中被选出的元素不超过K(K,M<=100) 个,并 ...
- 开源中国上抓取的content-type
开源中国上抓取的content-type类型,来源:http://www.cnblogs.com/smallyard/p/5632608.html { ".*": "ap ...
- Codeforces Round #222 (Div. 1) D. Developing Game 扫描线
D. Developing Game 题目连接: http://www.codeforces.com/contest/377/problem/D Description Pavel is going ...
- codevs 1191 树轴染色 线段树区间定值,求和
codevs 1191 树轴染色 Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.codevs.cn/problem/1191/ Des ...
- Python学习笔记(一):Python基础学习
总结的内容: 1.变量的命名 2.脚本的注释 3.运算符 4.用户输入语句 一.变量的命名 1.变量用于引用在程序中可能会变化的值.它们被称为变量是因为它们可能引用存储在内存中的不同的值. 2.变量的 ...
- jmeter用BeanShell调用jar包对HTTP请求中的参数进行MD5加密
前提: eclipse.JDK.Jmeter 说明: 本文分为两部分进行配置说明 第一部分:编写JavaMD5加密脚本 第二部分:使用Jmeter的BeanShell进行验证 ************ ...
- 在WAMPSERVER下增加多版本的PHP(PHP5.3,PHP5.4,PHP5.5)完美支持。
WAMPServer可以让开发者在Windows系统下快速搭建WAMP环境,它支持多版本的Apache.MySQL.PHP之间的相互切换,互不影响,对于PHPer开发者来讲极为方便快速. 以下是在WA ...