工作6年接触了很多语言,我的同事告诉我,他接触了一门语言,在学习过程中给我说了这个语言的各种好处,函数式语言,以前了解F#,但却从来没深入。
废话不多说,现在开始我的第一章吧。
1.搭建Scala环境
打开 eclipse 在 help - eclipse maketplace 在搜索栏中输入scala
安装完成以后,从新打开Eclipse
新建一个项目,选择Scala project ,打开window -> show ->view -> scala Interpreter 开始使用scala解释器
scala解释器是一个编写表达式和程序的交互式 Shell。
在表达式窗口输入printf("HelloWorld"):
结果:
居然支持动态解析,当年写C#的时候为了写动态编译的时候是费劲了心思。
2.定义Scala 变量
Scala 有两种变量 val 和var,val类似C#的const java里面的final变量,一旦初始化了,val就不能再赋值。const 与final是在编译环境就开始检查。
在解析器里输入
val msg = "HelloWolrd"
结果:
msg: String = HelloWolrd
Scala是弱类型,会将你所输入的变量,推断为所属的类型如
val msg = 123 , val msg = 123.00, val msg =“字符串” (我这里是从新定义的变量,val在定义的过程中是不能修改的,如果修改,在编译期就会报error: reassignment to val)
如果要重新赋值,则需要定义var
3.定义一些函数
def max(x: Int, y:Int):Int = { if(x>y) x else y }
函数定义 函数名称(变量名: 类型,变量名:类型) :返回类型 ={
处理方法
}
写到这里,我开始了我的疑惑,我的函数体根本没有return任何一个东西,怎么就返回了呢?
原来Scala 是不用写Return 的为了简化语法,像数学函数式一样。
下面新建一个Scala application 将代码放到项目里去执行。
File-new-Scala application
输入名称Hello
ctrl + F11输入结果:12
现在将代码里
def max(x: Int, y:Int):Int = {
返回类型给去掉,则变成
def max(x: Int, y:Int) = { if(x>y) x else y }
这时候运行同样输出结果:12
这时候我的疑惑又来了,为什么我没有指定返回类型,同样也能输出?
原来Scala里,没有返回类型这一说,而是结果类型。
就好像数学的函数一样,不是返回,而是结果,数学中每一个函数都要有一个结果,而Scala也是一样。
但如果我的函数里并没有返回类型会如何?
如下代码:
def printHello()={ println("Hello") }
Scala里会默认一个结果类型,Unit类型,如果返回这个类型就说明结果无意义。
Scala里的Unit 与C#的void 相似,但不等同,一个是返回,一个是结果。
你如果写一段C#或者C代码,返回的时候会将返回值
return x; mov eax,dword ptr [x]
赋给eax寄存器,然后调用ret指令(ret指令之前还有出栈一些寄存器,这些就不说了好比pop edi)
但是你如果设置的返回类型是void的话
你将看不到这段代码,而是出栈edi,esi,ebx之后直接调用ret指令。
而Scala里个人理解是一直有类似与 mov eax,dword ptr [x]的代码,因为Scala里每个方法都有结果。
对jvm 的字节码与字节码工具不太熟悉,如果有朋友能证实一下,那就多谢了。
4.循环与if判断
如下代码:
object Hello extends App { var str = Array("Hello","world","!") var i = 0 while (i < str.length) { print(args(i)) i += 1 } }
添加IF语句
object Hello extends App { var str = Array("Hello","world","!") var i = 0 while (i < str.length) { if (i != 0) print(" ") print(args(i)) i += 1 } }
(注:var str = Array("Hello","world","!") 将在数组里介绍)
这种编码方式与C#,java 编码方式很像,几乎没有什么区别,这种是指令式的编码方式,Scala允许你使用指令式的编码方式,因Scala不是纯函数式的
Scala学习了很多语言的经验与教训,写起来有点像java又有点像C#,又有点像C++,可以说,Scala是一个大融合。
接下来介绍函数式的循环:for each 与 for
第六步使用for each 和 for 枚举
现在让我们看看什么是函数式的转变
object Hello extends App { var str = Array("Hello","world","!") str.foreach { x => println(x) } }
什么?只用一行就实现了循环加println,这简直就是为了简洁了不止一倍!
如果以后代码发展到只用一段简单的话就实现了以前不知道要写多少代码才实现的功能,那我个人认为这就是语言的发展趋势!
写过C# lambda 都知道,这和 lambda一模一样,确实,这一点Scala是学习C# lambda表达式的。
Scala的作者都说过,幸好没有让scala变成一个技术大杂烩,它借鉴了太多的语言了。
Scala的解释器默认将 x解释为String,你也可以像下面一样,在x的后面定义string
str.foreach { x: String => println(x) }
总而言之函数的语法是 (x: String) => println(x) (变量: 类型) => 处理方法
Scala 没有像C#,java,C 那样的 for(int i =0;i< 100;i++)的体系取而代之的是
object Hello extends App { var str = Array("Hello", "world", "!") for (row <- str) println(row) }
总结:现在对函数式编程有了一个初步的概念,不过我的同事说,现在我看到的只是表象,只是看到了代码的简洁,而没有看到它更加强大的功能。(详见Scala编程)