这一篇是来自官网的Scala By Example

即Tutorial后更详细地对Scala怎么用给了示例

该文一开始给了一个快速排序的示例

版本一:

  def sort(xs: Array[Int]) {
def swap(i: Int, j: Int) {
val t = xs(i); xs(i) = xs(j);xs(j) = t
}
def sort1(l: Int, r: Int) {
val pivot = xs((l + r) / 2)
var i = l;
var j = r
while (i <= j) {
while (xs(i) < pivot) i += 1
while (xs(j) > pivot) j -= 1
if (i <= j) {
swap(i, j)
i += 1
j -= 1
}
}
if (l < j) sort1(l, j)
if (j < r) sort1(i, r)
}
sort1(0, xs.length - 1)
}

这里,除了定义方法和变量的def val 还有行尾的";",好像其他和Java也多大区别

再来看一个更能体现Scala特点的编程方法,同样是快速排序

 def sort(xs: Array[Int]): Array[Int] = {
if (xs.length <= 1) xs
else {
val pivot = xs(xs.length / 2)
Array.concat(
sort(xs filter (pivot >)),
xs filter (pivot ==),
sort(xs filter (pivot <)))
}
}

这样的编程方式更能体现快速排序的本质:

  • 如果数组xs只有一个元素,那么久直接返回xs(这里连return关键字都没有)
  • 如果xs有一个以上元素,则取中间值
  • 根据大于、等于、小于分块
  • 先对前面两个Array排序,再排第三个,然后拼接到前面两个的结果。(这应该是concat()函数的功能)

前者是命令式编程,改变了初始Array;而后者是函数是编程,产生了一个新的Array,只不过这需要占用更多的内存

这里的filter是判定函数

def filter(p: T => Boolean): Array[T]

返回判定为true的结果。像filter这样以别的函数为参数或作为结果返回称为高阶函数

Scala不区分标识符和运算符名称,任何标示符都可以作为中缀运算符,所以 xs filter (pivot >) 和xs.filter(pivot >) 是等价的
这里我们还可以看到代码中(pivot >)这部分是没有参数的,这就是部分应用函数,也可以写成 x => pivot > x 。这是一个匿名函数,Scala编译器会自动根据上下文推理。
def While (p: => Boolean) (s: => Unit) {
if (p) { s ; While(p)(s) }
}

TODO

1.Programing with Actors and Message

这里用一个电子竞拍服务讲解Actor模型。

2.Expressions and Simple Functions

3.First-class Functions

4.Class and Objects

5.Case Classes and Pattern Matching

6.Generic  Types and Methods

7.Lists

8.For-Comprehensions

9.Mutable State

10.Computing with Streams

11.Lazy Values

12.Implicit Parameters and Conversions

13.Hindley/Milner Type Inference

14.Abstractions for Concurrency

Scala学习——Scala By Example——to be continued的更多相关文章

  1. Scala学习资源

    Scala学习资源: Scala官方网站:http://www.scala-lang.org/ Scala github:https://github.com/scala/scala Twitter ...

  2. Scala学习(一)

    最近在学习Scala,总结了一下比较基础的知识. 一.Scala简介 1.Scalable Language,是一门多范式的编程语言,是一种纯面向对象的语言,每个值都是对象. 2.特点:①Scalab ...

  3. 学习Scala第一篇-从hello World开始

    最近开始系统性的学习scala.其实之前使用过scala的,比如我在用Gatling这款性能测试工具的时候就接触到了scala了.Gatling本身就是用Scala写的,而且Gatling的性能测试配 ...

  4. 怎样学习Scala泛函编程

    确切来说应该是我打算怎么去学习Scala泛函编程.在网上找不到系统化完整的Scala泛函编程学习资料,只好把能找到的一些书籍.博客.演讲稿.论坛问答.技术说明等组织一下,希望能达到学习目的.关于Sca ...

  5. scala学习笔记

    一 入门 为了增加编程趣味和技能,学习新语言,体会函数式编程和简易的并发管理模型,了解日渐活跃的Spark,尝试下Scala.Scala = Scalable language,作者是Martin O ...

  6. 学习Scala: 初学者应该了解的知识

    Scala开发参照清单 这里列出在开发一个Scala工程中需要参照的资料. 官网网站 http://www.scala-lang.org/ 文档网站 http://docs.scala-lang.or ...

  7. 【Todo】【读书笔记】大数据Spark企业级实战版 & Scala学习

    下了这本<大数据Spark企业级实战版>, 另外还有一本<Spark大数据处理:技术.应用与性能优化(全)> 先看前一篇. 根据书里的前言里面,对于阅读顺序的建议.先看最后的S ...

  8. scala学习资料

    强烈推荐一个s在线学习scala的网站: http://zh.scala-tour.com/#/overview

  9. Scala学习笔记1(安装)

    到 官网下载scala tar包  http://www.scala-lang.org/download/ mac Finder里双击解压. 改名成scala 进命令行, mv ~/Downloads ...

随机推荐

  1. 添加Access-Control-Allow-Origin主机头, 授权资源跨站访问

    时间 2014-09-24 22:02:48  All by Neil 原文  https://blog.byneil.com/添加access-control-allow-origin主机头-授权资 ...

  2. sql基础语法大全 转载过来的,出处忘了!

    一.基础 1.说明:创建数据库CREATE DATABASE database-name 2.说明:删除数据库drop database dbname3.说明:备份sql server--- 创建 备 ...

  3. 【拓扑 && 模板】Kosaraju算法

    #include<bits/stdc++.h> using namespace std; ; vector <int> g1[maxn],g2[maxn]; stack < ...

  4. Java基础教程(15)--枚举类型

      枚举类型定义了一个枚举值的列表,每个值是一个标识符.例如,下面的语句声明了一个枚举类型,用来表示星期的可能情况: public enum Day { SUNDAY, MONDAY, TUESDAY ...

  5. [源码] 定义String s="abcd", 求长度

    一般会答: s.length() 看源码是如何实现的: /** * Returns the length of this string. * The length is equal to the nu ...

  6. sublime3中如何快速生成html头部信息

    前提要安装Emmet 插件:已经结束了啊,不要以为下面的操作跟问题有关,下面是具体的生成头部信息方法 输入下边加粗的缩写,然后Tab,就可以了: 生成html4.01 Transitional用 ht ...

  7. Vue.js 的一些小技巧

    给 props 属性设置多个类型 这个技巧在开发组件的时候用的较多,为了更大的容错性考虑,同时代码也更加人性化: export default { props: { width: { type: [S ...

  8. 1415. [NOIP2001]数的计数

    ☆   输入文件:nums.in   输出文件:nums.out   简单对比 时间限制:1 s   内存限制:256 MB [题目描述] 我们要求找出具有下列性质数的个数(包含输入的自然数n): 先 ...

  9. Vue2.0项目打包后只能访问首页,其他页面路径错误找不到

    原因是你使用了vue-router的history,可以尝试去掉  // mode:"history",

  10. 关于 eval 的报错 Uncaught ReferenceError: False is not defined

    var obj ={'id': 16, 'name': '管理员', 'delflag': False, 'grade': 1000000.0}VM3614:1 Uncaught ReferenceE ...