面向对象编程是一种自顶向下的程序设计方法。用面向对象方法构造软件时,我们将代码以名词(对象)做切割,每个对象有某种形式的表示服(self/this)、行为(方法)、和状态(成员变量)。识别出名词并且定义出他们的行为之后,再定义出名词之间的交互。

  函数式编程方法通过组合和应用函数来构造软件。纯粹是对输入进行操作,产生结果。所有变量都被认为是不可变的。

  Spring的JDBCTemplate类上的查询方法

public interface JdbcTemplate{
List query(PreparedStatementCreator psc,RowMapper rowMapper)
.......
}

  用Scala直译

trait JdbcTemplate{
def query(psc : PreparedStatementCreator,rowMapper : RowMapper) : List[_]
}

看一下PreparedStatementCreator接口和RowMapper接口

public interface PreparedStatementCreator {
PreparedStatement createPreparedStatement(Connection con) throws SQLException;
} public interface RowMapper{
Object mapRow(ResultSet rs, int rowNum)
throws SQLException;
}

Scala提供了一等函数,把JdbcTemplate查询方法改成接受函数而不是接口作为参数。这样query方法就编程函数式了,返回值为ResultItem,这就是传说中的租借模式了。这样就创建了一个直接使用函数参数的接口了。

trait JdbcTemplate{
def query[ResultItem](psc:Connection => PreparedStatement; rowMapper : (ResultSet,Int) => ResultItem) : List[ResultItem]
}

Scala组合断言, or 方法接受两个断言,f1,f2,产生一个匿名函数。这个函数接受函数t,然后把f1(t)和f2(t)的结果 or 一下。

object Predicates{
def or[T](f1 : T => Boolean, f2 : T =>Boolean) = (t : T) => f1(t) || f2(t) def and[T](f1 : T =>Boolean,f2 : T=> Boolean) = (t : T)=> f1(t) && f2(t) val notNull[T] : T => Boolean = _ != null (_为语法占位符)

Scala把变量类型等基本操作

//可变整型变量
var x : Int //不可变整型变量
val x : Int //延迟执行的不可变整形变量
lazy val x : Int //用户指定类型
val x : Int = 5 //编译器推断类型
val y = 5 def myMethod(functionLiteral : A => B) : Unit
//显示的类型声明
myMethod({ arg : A : => new B})
//类型推断
myMethod({ arg => new B})

较简洁版的Scala快速排序

def qsort[T <% Ordered[T]](list:List[T]):List[T] = list match{
case Nil => Nil
case x :: xs =>
val (before,after) = xs partition ( _ < x)
qsort(before) ++ (x :: qsort(after));
)

Scala调用Java 使Java类库成为用Scala做开发时很自然的事

//Java对象
class SimpleJavaClass {
private String name;
public SimpleJavaClass(String name){
this.name = name;
} public String getName(){
return name;
} public static SimpleJavaClass create(String name){
return new SimpleJavaClass(name);
}
} //Scala里使用简单java对象 val x = SimpleJavaClass.create("Test")
x.getName()
val y = new SimpleJavaClass("Test")

Scala对象映射到java Scala对象实际上是一个单例类,在编译时此单例类命名为对象名后价格$符号。这个单例类里有个Module$静态成员,指向其唯一实例。

//Scala 对象
object ScalaUtils{
def log(msg : String) : Unit = Console.println(msg) val MAX_LOG+SIZE = 1056
} //在Java里使用Scala对象
ScalaUtils.log("Hello!");
ScalaUtils$.MODULE$.log("Hello");
System.out.println(ScalaUtils$.MODULE$.MAX_LOG_SIZE());
System.out.println(ScalaUtils.MAX_LOG_SIZE());

Scala第一章学习笔记的更多相关文章

  1. Spring实战第一章学习笔记

    Spring实战第一章学习笔记 Java开发的简化 为了降低Java开发的复杂性,Spring采取了以下四种策略: 基于POJO的轻量级和最小侵入性编程: 通过依赖注入和面向接口实现松耦合: 基于切面 ...

  2. Day1 《机器学习》第一章学习笔记

    <机器学习>这本书算是很好的一本了解机器学习知识的一本入门书籍吧,是南京大学周志华老师所著的鸿篇大作,很早就听闻周老师大名了,算是国内机器学习领域少数的大牛了吧,刚好研究生做这个方向相关的 ...

  3. [蛙蛙推荐]SICP第一章学习笔记-编程入门

    本书简介 <计算机程序的构造与解释>这本书是MIT计算机科学学科的入门课程, 大部分学生在学这门课程前都没有接触过程序设计,也就是说这本书是针对编程新手写的. 虽然是入门课程,但起点比较高 ...

  4. 《Django By Example》第一章 学习笔记

    首先看了下目录,在这章里 将会学到 安装Django并创建你的第一个项目 设计模型(models)并且生成模型(model)数据库迁移 给你的模型(models)创建一个管理站点 使用查询集(Quer ...

  5. 《Java基础教程》第一章学习笔记

    Java 是什么呀! 计算机语言总的来说分成机器语言,汇编语言,高级语言.其中Java一种高级计算机语言,它是一种可以编写跨平台应用软件,完全面向对象的程序设计语言. Java划分为三个技术平台,Ja ...

  6. Scala第二章学习笔记

    最基本的练习~: 使用伴生对象: object holder{ class Foo{ private var x = 5} object Foo{def im_in_yr_foo(f: Foo) = ...

  7. 【Python自然语言处理】第一章学习笔记——搜索文本、计数统计和字符串链表

    这本书主要是基于Python和一个自然语言工具包(Natural Language Toolkit, NLTK)的开源库进行讲解 NLTK 介绍:NLTK是一个构建Python程序以处理人类语言数据的 ...

  8. <<学会提问>>第一章学习笔记

    中国应不应该现在取消死刑? 中医是不是伪科学? 读书无用论? 集体主义和团队精神? 欧洲难民危机,你是支持接收难民,还是反对? 欧洲白左是不是幼稚圣母,抑或是右派种族歧视,顽固保守? 如何看待&quo ...

  9. CSAPP:第一章学习笔记:斗之气1段

    一.信息就是位+上下文:系统中的所有信息(包括磁盘文件.内存中的程序.网络上传送的数据),都是由一串比特表示,根据上下文对这些比特表示进行翻译. 二.C程序编译过程 1.源码结构 // test.c ...

随机推荐

  1. Kali安装

    Kali Linux 前身是 BackTrack ,不过Kali Linux是基于Debian 的 Linux 发行版,而BackTrack 则是基于Uubntu的,现在BackTrack 已经不更新 ...

  2. Java——设计模式(装饰模式_IO)

     /* * 装饰设计模式: *  对一组对象的功能进行增强时,就可以使用该模式进行问题的解决; * 装饰和继承都能实现一样的特点:  就是进行功能的扩转增强. * */ public class  ...

  3. MMU讲解

    MMU是Memory Management Unit的缩写,中文名是内存管理单元,它是中央处理器(CPU)中用来管理虚拟存储器.物理存储器的控制线路,同时也负责虚拟地址映射为物理地址,以及提供硬件机制 ...

  4. HTTPS-使用Fiddler抓取HTTPS数据包原理

    最近想尝试基于Fiddler的录制功能做一些接口的获取和处理工作,碰到的一个问题就是简单连接Fiddler只能抓取HTTP协议,关键的登录请求等HTTPS协议都没有捕捉到,所以想让Fiddler能够同 ...

  5. ABBYY导出结果为PDF注意事项

    使用ABBYY FineReader Pro for Mac OCR文字识别软件识别文档时,可以将已识别的文本保存到文件中,还可以通过电子邮件发送已识别的文本,只要输出格式受FineReader支持. ...

  6. js中冒泡事件和捕获事件

    js中冒泡事件和捕获事件: 冒泡事件:冒泡事件是从里向外,即是从被绑定元素开始一直向外到达页面的所有祖先元素都会被触发,这 一过程被称为事件冒泡.这个事件从原始元素开始一直冒泡到DOM树的最上层 捕获 ...

  7. js防止回车(enter)键提交表单及javascript中event.keycode

      如何防止回车(enter)键提交表单,其实很简单,就一句话.onkeydown="if(event.keyCode==13)return false;"把这句写在from标签里 ...

  8. selenium+python自动化之pycharm

    方法: 1.注册机界面,选择License serve.填入http://www.cnblogs.com/testdream/ 2.点击ok 3.注册界面选择:Activation coede 4.打 ...

  9. 百度ueditor学习使用

    1.下载ueditor解压 2. jsp里存放着开发所用到的jar包,导入项目即可 前端页面代码如下: <center> <form action="" meth ...

  10. C#子线程刷新界面并关闭窗体

    目的:要循环刷新界面上的控件,同时不影响用户操作.循环结束后关闭窗体. 步骤:先创建一个窗体,窗体中拖入一个lable控件(label1),一个button控件(button1) 代码窗口输入: // ...