Scala第一章学习笔记
面向对象编程是一种自顶向下的程序设计方法。用面向对象方法构造软件时,我们将代码以名词(对象)做切割,每个对象有某种形式的表示服(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第一章学习笔记的更多相关文章
- Spring实战第一章学习笔记
Spring实战第一章学习笔记 Java开发的简化 为了降低Java开发的复杂性,Spring采取了以下四种策略: 基于POJO的轻量级和最小侵入性编程: 通过依赖注入和面向接口实现松耦合: 基于切面 ...
- Day1 《机器学习》第一章学习笔记
<机器学习>这本书算是很好的一本了解机器学习知识的一本入门书籍吧,是南京大学周志华老师所著的鸿篇大作,很早就听闻周老师大名了,算是国内机器学习领域少数的大牛了吧,刚好研究生做这个方向相关的 ...
- [蛙蛙推荐]SICP第一章学习笔记-编程入门
本书简介 <计算机程序的构造与解释>这本书是MIT计算机科学学科的入门课程, 大部分学生在学这门课程前都没有接触过程序设计,也就是说这本书是针对编程新手写的. 虽然是入门课程,但起点比较高 ...
- 《Django By Example》第一章 学习笔记
首先看了下目录,在这章里 将会学到 安装Django并创建你的第一个项目 设计模型(models)并且生成模型(model)数据库迁移 给你的模型(models)创建一个管理站点 使用查询集(Quer ...
- 《Java基础教程》第一章学习笔记
Java 是什么呀! 计算机语言总的来说分成机器语言,汇编语言,高级语言.其中Java一种高级计算机语言,它是一种可以编写跨平台应用软件,完全面向对象的程序设计语言. Java划分为三个技术平台,Ja ...
- Scala第二章学习笔记
最基本的练习~: 使用伴生对象: object holder{ class Foo{ private var x = 5} object Foo{def im_in_yr_foo(f: Foo) = ...
- 【Python自然语言处理】第一章学习笔记——搜索文本、计数统计和字符串链表
这本书主要是基于Python和一个自然语言工具包(Natural Language Toolkit, NLTK)的开源库进行讲解 NLTK 介绍:NLTK是一个构建Python程序以处理人类语言数据的 ...
- <<学会提问>>第一章学习笔记
中国应不应该现在取消死刑? 中医是不是伪科学? 读书无用论? 集体主义和团队精神? 欧洲难民危机,你是支持接收难民,还是反对? 欧洲白左是不是幼稚圣母,抑或是右派种族歧视,顽固保守? 如何看待&quo ...
- CSAPP:第一章学习笔记:斗之气1段
一.信息就是位+上下文:系统中的所有信息(包括磁盘文件.内存中的程序.网络上传送的数据),都是由一串比特表示,根据上下文对这些比特表示进行翻译. 二.C程序编译过程 1.源码结构 // test.c ...
随机推荐
- c#部分---好题--顺便练练“类的知识”
练习:判断邮箱格式是否正确 //1.有且只能有一个@ //2.不能以@开头 //3.@之后至少有一个. //4.@和.不能靠在一起 //5.不能以.结尾
- 最小二乘法 java
import java.util.ArrayList; import java.util.Collection; import org.apache.commons.math3.optim.Point ...
- HDU 2085 核反应堆 --- 简单递推
HDU 2085 核反应堆 /* HDU 2085 核反应堆 --- 简单递推 */ #include <cstdio> ; long long a[N], b[N]; //a表示高能质点 ...
- HDU-5783 Divide the Sequence(贪心)
题目大意:给一个整数序列,将其划分成若干个子连续序列,使其每个子序列的前缀和不为负.求最大的划分个数. 题目分析:从后往做累加计算,如果不为负,则计数加一,累加和清0.否则,一直往前扫描.如果最终的和 ...
- 主机连接虚拟机 web服务
主机上安装了个VM centeros 首先通过 终端:ifconfig eth0 查看虚拟机的Ip地址 这样就能在主机上通过浏览器http://192.168.150.128/a.php 访问虚拟机的 ...
- HTML和JSON的数据交互-HTML模板
直接上源码,原文http://www.zhangxinxu.com/wordpress/2012/09/javascript-html-json-template/ <!DOCTYPE html ...
- Share Point 创建 TimerJob
public class SyncMetadataJob:SPJobDefinition { private const string JobName = @"Metadata Sync J ...
- Axure母版
1.生成母版: 在左侧窗口的最下方有母版管理窗口,可以在该管理窗口中直接新建母版.也可以在某个页面中将某些部件转换为母版.如图: ----------------------------------- ...
- 【转】POP3、SMTP和IMAP之间的区别和联系
POP3 POP3是Post Office Protocol 3的简称,即邮局协议的第3个版本,它规定怎样将个人计算机连接到Internet的邮件服务器和下载电子邮件的电子协议.它是因特网电子邮件的第 ...
- (委托事件处理)关于多线程执行显示进度条的实例(转)&&线程间操作无效: 从不是创建控件“rtxtEntryNO”的线程访问它。
关于多线程执行显示进度条的实例! 之前回答了一篇关于怎么在线程中操作进度条的帖子,估计有人看的不是很明白今天没事,写了一个小小的实例,很简单,就2个文件权当抛砖引玉,希望有更好解决方案的人发表一下意见 ...