Scala的基本概念

先讲讲Scala里头几个概念Classes, Traits, Objects and Packages。

Class和Java中的很像,只不过Scala中Class不能有static members。还有个叫做case的特殊类。

Object跟Class也很像,只不过它只能有一个instance,它可以有 static members。

Traits跟Java中的Interface很像,不过它可以有concrete members, i.e. method implementations or field definitions

Packages跟Java中的也很像。不只是类型可以被import。for instance if you have an object baz in package foo.bar, then import foo.bar.baz._ would import all the members of that object.

想要快速看懂Scala的奇葩代码的话十二步学会Scala这篇日志不错,可以在simplyscala上小试牛刀,progfun课程也有个Cheatsheet

我来说说里面比较好(keng)玩(die)的几个例子,你们随意感受一下

1 神奇的替代符_

scala> def max(x: Int, y: Int): Int = if(x < y) y else x

max: (x: Int, y: Int)Int

scala> val m = max _

m: (Int, Int) => Int = <function2>

scala> m(1,2)

res0: Int = 2

scala> val m = max(1:Int, _:Int)

m: Int => Int = <function1>

scala> m(-1)

res3: Int = 1

2 特别的括号<>[]()用法

scala> val str = new Array[String](3)

str: Array[String] = Array(null, null, null)

scala> str(0) = "hello"

scala> str(1) = ","

scala> str(2) = "world"

3 foreach和for循环,还有奇妙的apply语法糖

scala> str.foreach(s=>print(s))

hello,world

scala> str.foreach(print)

hello,world

scala> for(s <- str)

| print(s)

hello,world

scala> for(i <- 0.to(2))

| print(str.apply(i))

hello,world

scala> for(i <- 0 to 2)

| print(str apply i)

hello,world

4 foreach:没有返回值的map

  collect:可以只返回部分元素处理结果的map

scala> val mixedList = List("a", 1, 2, "b", 19, 42.0)
mixedList: List[Any] = List(a, 1, 2, b, 19, 42.0)

scala> mixedList.map{
| case i: Int => "Int:" + i.toString
| case s: String => "String:" + s
| case _ => ""
| }
res20: List[java.lang.String] = List(String:a, Int:1, Int:2, String:b, Int:19, "")

scala> mixedList.foreach{
| case s: String => "String:" + s
| case i: Int => "Int:" + i.toString
| case _ => ""
| }

//没有返回值

scala> mixedList.collect{
| case i: Int => "Int:" + i.toString
| case s: String => "String:" + s
| }
res22: List[java.lang.String] = List(String:a, Int:1, Int:2, String:b, Int:19)

5 reduce、foldLeft/foldRight和scanLeft/scanRight

 

scala> val input = List(3, 5, 7, 11)

input: List[Int] = List(3, 5, 7, 11)

scala> input.foldLeft(0)(_+_)

res35: Int = 26

scala> input.reduce(_+_)

res36: Int = 26

scala> input.scanLeft(0)(_+_)
res0: List[Int] = List(0, 3, 8, 15, 26)

scala> input.scanRight(0)(_+_)
res1: List[Int] = List(26, 23, 18, 11, 0)

6 filter

 

scala> def isEven(i: Int): Boolean = i % 2 == 0

isEven: (i: Int)Boolean

scala> numbers.filter(isEven _)

res2: List[Int] = List(2, 4)

Curry化的函数

8 flatMap:先map再flatten

scala> val lstw=List("Once","more","unto","the","breach")

lstw: List[java.lang.String] = List(Once, more, unto, the, breach)

scala> lstw.flatMap(_.toList)

res9: List[Char] = List(O, n, c, e, m, o, r, e, u, n, t, o, t, h, e, b, r, e, a, c, h)

scala> lstw.map(_.toList)

res15: List[List[Char]] = List(List(O, n, c, e), List(m, o, r, e), List(u, n, t, o), List(t, h, e), List(b, r, e, a, c, h))

scala> lstw.map(_.toList).flatten

res17: List[Char] = List(O, n, c, e, m, o, r, e, u, n, t, o, t, h, e, b, r, e, a, c, h)

9 用case class处理Map的元素

scala> val extensions = Map("steve" -> 100, "bob" -> 101, "joe" -> 201)

extensions: scala.collection.immutable.Map[java.lang.String,Int] = Map(steve -> 100, bob -> 101, joe -> 201)

scala> extensions.filter({case (name,ext) => ext<200})

res0: scala.collection.immutable.Map[java.lang.String,Int] = Map(steve -> 100, bob -> 101)

scala> extensions.filter({namePhone:(String, Int) => namePhone._2<200})

res1: scala.collection.immutable.Map[java.lang.String,Int] = Map(steve -> 100, bob -> 101)

10 特别的数据类型 Option[T],Some[T],None

scala> numbers.getOrElse(9,-1)
res4: Any = -1

scala> numbers.get(9).getOrElse(-1)

res5: Any = -1

scala> numbers.get(9) match{

| case Some(n)=>n

| case None => -1

| }

res6: Any = -1

11 val, lazy, def的区别

举个栗子:

1 val strVal = scala.io.Source.fromFile("test.txt").mkString //在strVal被定义的时候获取值,如果test.txt不存在,直接报异常
2  
3 lazy val strLazy = scala.io.Source.fromFile("test.txt").mkString //在strLazy第一次被使用的时候取值,如果test.txt不存在,不使用strLazy是不会报异常的,第一次访问strLazy的时候报异常
4  
5 def strDef = scala.io.Source.fromFile("test.txt").mkString //每次使用的时候都重新取值<span></span>

如果一开始test.txt内容是"a",定义好之后,将test.txt内容改为"ab",则strVal == "a", strLazy == "ab",strDef == "ab"。

再将test.txt内容改为"abc",则strVal == "a", strLazy == "ab",strDef == "abc"。再修改test.txt的内容,strVal和strLazy都不会改变,而strDef每次都更新。

 

12 正则表达式

 

在Scala中,java.lang.String里丰富的字符串处理库是可以直接用哒,你可以这样

str match{
case s if s.startsWith("!!!")=> s.stripPrefix("!!!")
case _ =>
}

不过如果你愿意,也可以这样

val r ="""^!!!(.*)""".r 
val r(suffix)="!!!rest of string"

So suffix will be populated with rest of string, or a scala.MatchError gets thrown.

A different variant would be:

val r ="""^(!!!){0,1}(.*)""".r 
val r(prefix,suffix)=...

And prefix will either match the !!! or be null. e.g.

(prefix, suffix) match{
case(null, s)=>"No prefix"
case _ =>"Prefix"
}

13.Dynamic(虽然我觉得这个其妙的功能其实没啥用啊)

Scala 2.10.0 新特性之动态属性、方法

scala 的 Dynamic 与其应用

14.Reflection和Macro

Environment, Universes, and Mirrors

scala 的 reflection 与 macro 初探

 

最后谈下函数式数据结构:

函数式编程一个很大的特点就是方法不产生副作用(side effects),就是这个方法不改变任何东西。参数传进去,经过加工输出这个过程中没有任何变量被改变。像Java的String就是一个例子,是不可更改,它里面所有的方法都不会把对象里面任何东西做更改。
上述数组str定义为val变量,定义了类型和容量,那么这个变量的类型和容量就不能修改了。但他里面的元素还是可以重新赋值,产生了副作用,因此Array不是纯函数式的类。
但是Scala的List和Tuple是函数式的,也就是一次定型,不可修改。

关于Scala,Coursera开了课,可以看看配环境之类的

https://class.coursera.org/progfun-003

学语法还是自己看文字比较快

http://twitter.github.io/scala_school/zh_cn

http://www.ibm.com/developerworks/cn/java/j-scala

http://www.ibm.com/developerworks/cn/java/j-lo-funinscala2

http://zh.scala-tour.com/#/welcome

API文档里头都没有demo,不太友好

http://scalachina.com/api/index.html#package

常用的数据结构不妨看文档

http://docs.scala-lang.org/overviews/collections/sets.html

http://docs.scala-lang.org/overviews/core/string-interpolation.html

http://docs.scala-lang.org/cheatsheets

http://docs.scala-lang.org/tutorials

http://docs.scala-lang.org/tutorials/scala-for-java-programmers.html

http://www.scala-lang.org/documentation/

基础打好后,就要有更高的追求啦,Effective Scala欢迎你

参考:

http://my.oschina.net/magicly007/blog/164328

Scala初探:新潮的函数式面向对象语言的更多相关文章

  1. 用C表达面向对象语言的机制——C#版

    PS:本文PDF版在这里(格式更好看一些).最新的源代码请在本页面文末下载,PDF中的链接不是最新的. 用C表达面向对象语言的机制——C#版 我一直认为,面向对象语言是对面向过程语言的封装.如果是这样 ...

  2. 用C表达面向对象语言的机制2——颠覆你对方法调用的看法!

    用C表达面向对象语言的机制2——颠覆你对方法调用的看法! 源代码在文末.推荐阅读本文PDF版,格式更好看. 在上一篇<用C表达面向对象语言的机制——C#版>中,我们获知了如何用C表达面向对 ...

  3. Spark小课堂Week5 Scala初探

    Spark小课堂Week5 Scala初探 Scala是java威力加强版. 对Java的改进 这里会结合StreamingContext.scala这个代码说明下对Java的改进方面. 方便测试方式 ...

  4. C#学习-面向对象语言都有类

    面向对象语言的一个基本特征是它们都有类,类是C#(这类语言)中的一种复杂数据类型. 类代表一组具有公共属性和行为的对象. 在C#中定义一个类是非常简单的,只需使用class关键字并按格式来定义即可. ...

  5. javascript是一种面向对象语言吗?如果是,您在javascript中是如何实现继承的呢

    ·oop(面向对象程序设计)中最常用到的概念有 1.对象,属性,方法 1>(对象:具体事物或抽象事物,名词) 2>(属性:对象的特征,特点,形容词) 3>(方法:对象的动作,动词) ...

  6. java反射并不是什么高深技术,面向对象语言都有这个功能,而且功能也很简单,就是利用jvm动态加载时生成的class对象

    java反射并不是什么高深技术,面向对象语言都有这个功能. 面向对象语言都有这个功能,而且功能也很简单,就是利用jvm动态加载时生成的class对象,去获取类相关的信息 2.利用java反射可以调用类 ...

  7. go 学习笔记之go是不是面向对象语言是否支持面对对象编程?

    面向对象编程风格深受广大开发者喜欢,尤其是以 C++, Java 为典型代表的编程语言大行其道,十分流行! 有意思的是这两中语言几乎毫无意外都来源于 C 语言,却不同于 C 的面向过程编程,这种面向对 ...

  8. Scala - 快速学习09 - 函数式编程:一些操作

    1- 集合类(collection) 系统地区分了可变的和不可变的集合. scala.collection包中所有的集合类 可变集合(Mutable) 顾名思义,意味着可以修改,移除或者添加一个元素. ...

  9. Scala - 快速学习08 - 函数式编程:高阶函数

    函数式编程的崛起 函数式编程中的“值不可变性”避免了对公共的可变状态进行同步访问控制的复杂问题,能够较好满足分布式并行编程的需求,适应大数据时代的到来. 函数是第一等公民 可以作为实参传递给另外一个函 ...

随机推荐

  1. Python3基础 sort 将一个列表中的值升序排列

    镇场诗:---大梦谁觉,水月中建博客.百千磨难,才知世事无常.---今持佛语,技术无量愿学.愿尽所学,铸一良心博客.------------------------------------------ ...

  2. 什么是 Help Desk?

    科技如何帮助公司发展,关键就在于保证IT系统的安全稳定运行.我们都知道要保证系统100%可用非常难实现,那么如何在系统故障时减少处置时间?一个有效的办法就是帮助台(Help Desk).那么什么是帮助 ...

  3. 【树莓派】使用树莓派制作img镜像(一)

    最近一直在折腾树莓派,前几天装了10台设备,最近又来了15台开发板子.基本每台设备都需要进行如下操作: 1.安装树莓派OS,并配置键盘.时区.语言编码格式等: 2.新增组.用户.配置静态IP地址: 3 ...

  4. 没有技术说明文档的开源都是耍流氓:微软Roslyn编译即服务在CIIP中具体应用(上)

    前段时间我发布了 github开源:企业级应用快速开发框架CIIP WEB+WIN+移动端,很多园友们都表示支持并与我探讨相关技术问题,上篇中我也承诺会写相关的技术文章,本篇就来介绍一下建模模块中使用 ...

  5. 从webRoot中下载Excel

    @RequestMapping("downLoad") public void downLoad(Offsupervise off1,HttpServletRequest requ ...

  6. STM32学习笔记(九) 外部中断,待机模式和事件唤醒

    学会知识只需要不段的积累和提高,但是如何将知识系统的讲解出来就需要深入的认知和系统的了解.外部中断和事件学习难度并不高,不过涉及到STM32的电源控制部分,还是值得认真了解的,在本文中我将以实际代码为 ...

  7. Django URL传递参数的方法总结(转)

    1 无参数情况 配置URL及其视图如下: 1 2 3 4 (r'^hello/$', hello)   def hello(request): return HttpResponse("He ...

  8. oracle中如何创建dblink

    当用户要跨本地数据库,访问另外一个数据库表中的数据时,本地数据库中必须创建了远程数据库的dblink,通过dblink本地数据库可以像访问本地数据库一样访问远程数据库表中的数据.下面讲介绍如何在本地数 ...

  9. VS2012添加PlaySound引用

    <windows程序设计>中给出的demo代码中有PlaySound的使用,但是因为这个是代码是针对VC6.0,其中说明的引用的添加和VS2012中有些许不同. 在VC6.0中projec ...

  10. [转]JAVA虚拟机的生命周期

    JAVA虚拟机体系结构 JAVA虚拟机的生命周期 一个运行时的Java虚拟机实例的天职是:负责运行一个java程序.当启动一个Java程序时,一个虚拟机实例也就诞生了.当该程序关闭退出,这个虚拟机实例 ...