设为首页 加入收藏

TOP

为Play初学者准备的Scala基础知识(一)
2017-10-09 14:10:16 】 浏览:7041
Tags:Play 学者 准备 Scala 基础知识

欢迎访问PlayScala社区(http://www.playscala.cn/)

1 前言

本文的主要目的是为了让Play Framework的初学者快速了解Scala语言,算是一篇Play Framework的入门前传吧。
使用PlayFramework可以极大的提高开发效率,但是需要注意,PlayJava入门很简单,我之前带过一个实习小姑娘,有一点编程经验,但从来没有接触过PlayJava,然而一周入门,一个月独立完成项目。但是PlayScala没那么简单,虽然后者的开发效率更高,但是由于Scala程序员匮乏,PlayScala只适合团队较小(10人以下)并且较稳定的情况下使用。其实有很多人怀疑,Scala到底能提高多少开发效率,这里有一行Scala代码,大家可以先体会一下:

Source.fromFile("D:/f.txt", "UTF-8").getLines().toList.distinct.sortBy(s => (s.charAt(0), s.length)).foreach( println _)

虽然只有一行代码,但是却做了很多事情:以UTF-8编码读取文件所有行 -> 去重 -> 按首字符排序,首字符相同按长度排序 -> 打印结果。各位脑补一下Java的实现。更多的一行代码请查看酷炫的一行代码 - Scala就是这么任性!。下面我们进入正题,先看Scala语言简介。

2 Scala简介

提到编程语言,大家的第一反应通常是面向对象编程(OOP), 然而随着硬件服务器CPU核数和个数越来越多,函数式编程(FP)语言又重新回到了人们的视线。两种编程语言都各有特点,面向对象编程符合人类对世界的认知,更容易理解;函数式编程的语法更接近人类语言,简洁高效。两种语言都让人无法取舍。而Scala将这两种编程语言完美的融合到一起,形成一门更加强大的JVM语言,同时Scala修正了Java很多不合理的设计,新增了更多高级特性,学习Scala的同时也是对Java的一次深度回顾,让你对编程语言的理解更加地深刻。与Java相比,Scala的设计更加一致:

  • 一切都是对象

    1.toDouble //可以直接调用基本类型上的方法 "1".toInt //将字符串转换成整型
  • 一切都是方法

    "a" * 3 //等价于: "a".*(3) 2 - 1 //等价于: 2.-(1)
  • 一切都是表达式

    val i = if(true){ 1 } else { 0 } // i = 1

Scala拥有一套强大的类型推导系统,所以你可以像动态类型语言那样编码,降低代码冗余度,减少无意义击键次数同时,代码也显得更加清晰易懂。
另外Java和Scala对待程序员的态度也很有意思,这里只是开个玩笑,大家别太在意。Java认为他所面对的程序员是一帮小白,容易犯错误,所以想方设法的限制你,避免你犯错;而Scala则认为他所面对的程序员是一帮天才,所以尽可能的向他敞开编程语言宝库,给他更大的自由度去想象和创作。

3 基本语法规则

3.1 变量声明

val用于定义不可变变量,var用于定义可变变量,这里的"可变"指的是引用的可变性。val定义的变量类似于Java的final变量,即变量只能赋一次值:

val msg = "hello" // 等价于:val msg: String = "hello" var i = 1 // 等价于:var i: Int = 1 i = i + 1

变量后面的类型声明可以省略,每行代码末尾的分号";"也可以省略。

3.2 函数声明

def用于定义函数:

def max(x: Int, y: Int): Int = { if (x > y) { x } else { y } } val maxVal = max(1, 2) // 2

Scala是函数式语言,所以你可以像基本类型那样把函数赋给一个变量:

val max = (x: Int, y: Int) => { if (x > y) { x } else { y } } val maxVal = max(1, 2) // 2

等号"="右边是一个匿名函数,也就是我们常说的Lambda函数,匿名函数由参数和函数体两部分组成,中间用"=>"隔开,这里省略了max变量的类型,因为编译器可以自动推断出来,完整的写法如下:

val max: (Int, Int) => Int = (x: Int, y: Int) => { if (x > y) { x } else { y } }

max的类型是(Int, Int) => Int,即接受两个Int参数,产生一个Int返回值的函数类型。

3.3 class

Scala的class定义和Java很相似:

class Counter { private var value = 0 //你必须初始化字段 def increment() { value += 1} //方法默认public def current() = value }

Scala的源文件中可以定义多个类,并且默认都是public,所以外界都可以看见。class的使用也很简单:

val myCounter = new Counter //或new Counter() myCounter.increment() println(myCounter.current) //或myCounter.current()

Scala中如果对象方法或类的构造器没有参数,则括号"()"可以省略。

3.4 object

Scala没有静态方法和静态字段,而是提供了object对象,也就是Java中的单例对象,即全局只有一个实例。

object Accounts { private var lastNumber = 0 def newUniqueNumber() = { lastNumber += 1; lastNumber } }

因为Accounts是一个单例对象,可以直接使用而无需初始化:

val uniqueNumber = Accounts.newUniqueNumber

object的另一个用法是作为类的伴生对象, 类似于Java类上的静态方法,只不过Scala将Java类上的静态功能全交给object实现了。object作为伴生对象时必须和类在同一个源文件中定义,并且可以相互访问私有属性。

3.5 apply方法

如果某个对象obj上定义了apply方法,则我们可以这样调用:

obj(arg1, ... , argn)

是的,你猜对了,伴生对象上的apply方法立马就派上用场了,例如List类有一个同名的伴生对象List,那么你可以这样初始化一个列表:

val list = List("a", "b", "c")

想想下面的Java版本,是不是感觉幸福感油然而生:

List<String> list = new ArrayList<String>(); list.add("a"); list.add("b"); list.add("c");

3.6 块表达式

在Scala中一切都是表达式,如果表达式含有多条语句,则使用大括号&

首页 上一页 1 2 3 4 下一页 尾页 1/4/4
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇Scala-基础-运算符 下一篇Scala基础 - 下划线使用指南

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目