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)

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏令仔很忙

新手学JAVA(二)----String类与StringBuffer类的区别

在Java中有两种字符串的操作:String类和StringBuffer类(缓冲字符串处理类)。 下面先简单的说一下两者的区别。 String类和St...

12820
来自专栏小灰灰

Java 反射简单实例

反射 什么是反射,反射有什么用,反射该怎么用? 一些概念性的东西,这里就不细说了,下面主要给出一个非常简单的反射的调用工具类; 后续会提供一个基于Spring...

23850
来自专栏PHP在线

PHP Predefined Interfaces 预定义接口

SPL提供了6个迭代器接口: Traversable遍历接口(检测一个类是否可以使用 foreach 进行遍历的接口)Iterator迭代器接口(可在内部迭代自...

36350
来自专栏技术小黑屋

Java中的字符串常量池

Java中字符串对象创建有两种形式,一种为字面量形式,如String str = "droid";,另一种就是使用new这种标准的构造对象的方法,如String...

20620
来自专栏企鹅号快讯

Python读书笔记7

上期和大家分享了列表的创建及列表的基本特性,本期和大家分享一下列表改增删操作。 一、列表的修改 ? 上期的这个图还记得吗? 这个图说明了字符串的不可变性及列表的...

21990
来自专栏海天一树

小朋友学C++(17):析构函数

析构函数(destructor) 与构造函数相反,当对象结束其生命周期时(例如对象所在的函数已调用完毕),系统自动执行析构函数。析构函数往往用来做“清理善后” ...

298100
来自专栏程序员互动联盟

【专业技术】C++虚函数的缺省参数

编者按:缺省参数,缺省函数,缺省构造函数,如果你有些迷糊,本文可以让你把它看个清楚。呵呵。 前些日子,有个同学问我一个关于虚函数的缺省参数问题。他是从某个论坛上...

29760
来自专栏java学习

面试题55(考察求职者对类的声明的掌握)

(不定项选择题)在Java中下面Class的声明哪些是错误的? A public abstract final class Test { abstract ...

35450
来自专栏WD学习记录

Python数据结构与算法笔记(2)

栈、队列、deques、列表是一类数据的容器,它们数据项之间的顺序由添加或删除的顺序决定。一旦一个数据项被添加,它相对于前后元素一直保持该位置不变。诸如此类的数...

11610
来自专栏大数据

Zzreal的大数据笔记-ScalaDay02

昨天整理了一下Scala的一些基本内容,不是很全面,不过作为学习Spark的基础足够了, 如果需要系统的学习Scala,建议还是去菜鸟教程一步步的看下来会比较条...

196100

扫码关注云+社区

领取腾讯云代金券