Scala第二章学习笔记
最基本的练习~:

使用伴生对象:
object holder{
class Foo{ private var x = 5}
object Foo{def im_in_yr_foo(f: Foo) = f.x}
}
import holder.Foo
val x = new Foo
Foo.im_in_yr_foo(x)
基本的会话: Scala的if块是个表达式。在Java中,达到类似的目的就是这种代码: String x = true ? "true string" : "false string" Scala中没有?:的语法
if(true) 5 else "hello"
if(false) 5 else "hello"
方法和模式匹配
在JAVA编程时,有个常用的实践是每个方法只有一个返回点。每个方法的最后一行都会是个retrun语句。
def createErrorMessage(errorCode : Int):String = {
var result : String = _
errorCode match {
case 1 =>
result = "Network Failure"
case 2 =>
result = "..."
case 3 m=>
result = "..."
}
return result;
}
使用模式匹配提供的面向表达式语法改进代码: (result改为了 val类型,模式匹配能够判断唯一的值和类型)
def createErrorMessage(errorCode : Int):String = {
val result = errorCode matchj{
case 1 => "NewWork Failure"
case 2 =>"..."
case 3 =>"..."
}
return result
}
最终改进结果 模式匹配是这个方法唯一一个语句,而它返回个字符串类型的表达式- -
def createErrorMessage(errorCode : Int) : String = errorCode match{
case 1 => "NewWork Failuer:
case 2 = > "....."
case _ = >"....."
}
并发:
创建个索引服务,用键值来查找特定项。服务由两个方法构成,lookUp方法根据key的索引查找值,insert方法插入新值, 基本是个键值对的映射。用加锁和可变hashMap实现,第一个currentIndex指向存放数据的可变HashMap,look和insert方法都用sychronized块包起来,表明对MutableService自身做同步。
import collection.mutable.{HashMap=>MutableHashMap}
class MutableService[Key, Value] extends Service[Key, Value]{
val currentIndex = new MutableHashMap[Key,Value]
def lookUp(k:key) : Option[Value] = synchronized(currentIndex.get(k))
def insert(k : key, v : value) : Unit = synchronized{
currentIndex.put(k,v)
}
}
把currentIndex改成一个不可变的HashMap,每次调用insert方法的时候覆盖原值。lookUp方法就可以不加任和锁了。currentIndex是个指向不变变量的可变引用,每次insert操作都会更新引用。
class ImmutableService[Key, Value] extends Service[Key,Value]{
var currentIndex = new ImmutableHashMap[Key,value]
def lookUp(k : Key) : Option[Value] = currentIndex.get(k)
def insert(k : key, v : Value) : Unit = synchronized{
currentIndex = currentIndex + ((k,v))
}
}
Scala标准库提供了scala.Option类,鼓励大家在编程时尽量不要使用null.

Option高级技巧 (被当做集合对待)
1、创建对象或返回默认值 接收Option[String]的参数 返回指向file对象,对opiton应用map方法,在参数有值得请客下创建一个File对象。filter方法确保这个新建文件对象必须是目录。
def getTemporaryDirectory(tmpArg : Option[String] : java.io.File = { tmpArg.map( name => new java.io.File(name)).
filter(_.isDirectory).
getOrElse(new java.io.File(
System.getProperty("java.io.tmpdir")))
}
2、foreach方法 能够仅当Option有值时才执行某段代码块。因为Option要么有零或一个值,所以代码要么执行,要么不执行。
val username : Option[String] = ...
for(uname <- username) {
println("User: " + uname)
)
例如:Java Servlet框架对用户进行验证,如果验证成功,则安全注入HttpSession,后续的filter和servlet可以检查用户的访问权限。 Scala的惯例是不要把null或未初始化的参数传给函数。
如果多个Option都有值则执行代码
def authenticateSession(session : HttpSession, username :Option[String],password : Option[Array[Char]]) = {
for(u <- usrname ;p <- password;
if canAuthenticate(usrname,password)){
val privileges = privilegesFor(u)
injectProvilegesIntoSession(session,privileges)
}
}
3、用多个可能未初始化的变量构造另一个变量 这里简单地把数据库配置参数转化为一个Option。
def createConnection(conn_url : Option[String],conn_user : Option[String],conn_pw : Option[String]) : Option[Connection] =
for{
url <- conn_url
user <- conn_user
pw <- conn_pw
}yield DriverManager.getConnection(url,user,pw)
上述代码可以通过转换函数,抽象化。
def lift3[A,B,C,D](f : Function3[A,B,C,D]) : Function3[Option[A], Option[B] (oa : Option[A], ob: Option[B], oc: Option[C]) =>
for(a <- oa; b<- ob; c<- oc) yield f(a,b,c)
}
lift3(DriverManager.getConnection)
Scala第二章学习笔记的更多相关文章
- AS开发实战第二章学习笔记——其他
第二章学习笔记(1.19-1.22)像素Android支持的像素单位主要有px(像素).in(英寸).mm(毫米).pt(磅,1/72英寸).dp(与设备无关的显示单位).dip(就是dp).sp(用 ...
- #Spring实战第二章学习笔记————装配Bean
Spring实战第二章学习笔记----装配Bean 创建应用对象之间协作关系的行为通常称为装配(wiring).这也是依赖注入(DI)的本质. Spring配置的可选方案 当描述bean如何被装配时, ...
- Python核心编程第三版第二章学习笔记
第二章 网络编程 1.学习笔记 2.课后习题 答案是按照自己理解和查阅资料来的,不保证正确性.如由错误欢迎指出,谢谢 1. 套接字:A network socket is an endpoint of ...
- Day2 《机器学习》第二章学习笔记
这一章应该算是比价了理论的一章,我有些概率论基础,不过起初有些地方还是没看多大懂.其中有些公式的定义和模型误差的推导应该还是很眼熟的,就是之前在概率论课上提过的,不过有些模糊了,当时课上学得比较浅. ...
- 《Linux内核设计与实现》课本第一章&第二章学习笔记
<Linux内核设计与实现>课本学习笔记 By20135203齐岳 一.Linux内核简介 Unix内核的特点 Unix很简洁,所提供的系统调用都有很明确的设计目的. Unix中一切皆文件 ...
- Linux第一章第二章学习笔记
第一章 Linux内核简介 1.1 Unix的历史 它是现存操作系统中最强大最优秀的系统. 设计简洁,在发布时提供原代码. 所有东西都被当做文件对待. Unix的内核和其他相关软件是用C语言编写而成的 ...
- Machine Learning In Action 第二章学习笔记: kNN算法
本文主要记录<Machine Learning In Action>中第二章的内容.书中以两个具体实例来介绍kNN(k nearest neighbors),分别是: 约会对象预测 手写数 ...
- Scala第一章学习笔记
面向对象编程是一种自顶向下的程序设计方法.用面向对象方法构造软件时,我们将代码以名词(对象)做切割,每个对象有某种形式的表示服(self/this).行为(方法).和状态(成员变量).识别出名词并且定 ...
- Thinking in Java 第二章学习笔记
Java虽基于C++,但相比之下,Java是一种更加纯粹的面向对象程序设计语言. 在Java的世界里,几乎一切都是对象,而Java中的全部工作则是定义类,产生那些类的对象,以及发送消息给这些对象. 尽 ...
随机推荐
- TFTP网络协议分析---15
TFTP网络协议分析 周学伟 文档说明:所有函数都依托与两个出口,发送和接收. 1:作为发送时,要完成基于TFTP协议下的文件传输,但前提是知道木的PC机的MAC地址,因为当发送TFTP请求包时必须提 ...
- leetcode 37 Sudoku Solver java
求数独,只要求做出一个答案就可以. 刚开始对题意理解错误,以为答案是唯一的, 所以做了很久并没有做出来,发现答案不唯一之后,使用回溯.(还是借鉴了一下别人) public class Solution ...
- Compiler ,Interpreter, Linker
https://en.wikipedia.org/wiki/Interpreter_(computing) https://en.wikipedia.org/wiki/Compiler https:/ ...
- 如何处理ABBYY中出现错误代码142和55的问题
在使用ABBYY FineReader 12OCR文字识别软件创建PDF文件时,有时会出现以下错误提示:内部程序错误..\Src\SpecialFontFactory.cpp,142和内部程序错误.. ...
- 怎么用ABBYY将PDF转换为JPEG图像
FineReader Mac版,全称ABBYY FineReader Pro for Mac,是一款流行的OCR图文识别软件,可快速方便地将扫描纸质文档.PDF文件和数码相机的图像转换成可编辑.可搜索 ...
- python_Memcached
一.Memcached 1.Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态.数据库驱动网 ...
- Python语言初学总结
课程名称:程序设计方法学 实验1:程序设计语言工具 时间:2015年10月21日星期三,第3.4节 地点:理工楼1#208 一.实验目的 1.深入理解程序设计语言及其几种常见的编程范型: 2.激发学生 ...
- java从零到变身爬虫大神(一)
学习java3天有余,知道一些基本语法后 学习java爬虫,1天后开始出现明显效果 刚开始先从最简单的爬虫逻辑入手 爬虫最简单的解析面真的是这样 import org.jsoup.Jsoup; imp ...
- Redis 高可用性解决方案(Sentinel)
Sentinel是Redis的高可用性解决方案: 由一个或多个Sentinel实例组成的Sentinel系统可以监视任意多个主服务器,以及所有从服务器,并在被监视的主服务器进入下线状态时,自动将下线主 ...
- 使用maven编译dubbo,导入eclipse(其他maven开源项目编译类似)
dubbo github下载地址:https://github.com/alibaba/dubbo 相关文档:http://dubbo.io/ 使用maven编译dubbo,导入eclipse(其他m ...