Scala编程语言近来抓住了很多开发者的眼球 如果你粗略浏览Scala的网站 你会觉得Scala是一种纯粹的面向对象编程语言 而又无缝地结合了命令式和函数式的编程风格 Christopher Diggins认为
不太久之前编程语言还可以毫无疑义地归类成 命令式 或者 函数式 Scala代表了一个新的语言品种 它抹平了这些人为划分的界限
根据David Rupp在博客中的说法 Scala可能是下下一代Java 这么高的评价让人不禁想看看它到底是什么东西
Scala有几项关键特性表明了它的面向对象的本质 例如 Scala中的每个值都是一个对象 包括基本数据类型(即布尔值 数字等)在内 连函数也是对象 另外 类可以被子类化 而且Scala还提供了基于mixin的组合(mixin based position)
与只支持单继承的语言相比 Scala具有更广泛意义上的类重用 Scala允许定义新类的时候重用 一个类中新增的成员定义(即相较于其父类的差异之处) Scala称之为mixin类组合
Scala还包含了若干函数式语言的关键概念 包括高阶函数(Higher Order Function) 局部套用(Currying) 嵌套函数(Nested Function) 序列解读(Sequence Comprehensions)等等
Scala是静态类型的 这就允许它提供泛型类 内部类 甚至多态方法(Polymorphic Method) 另外值得一提的是 Scala被特意设计成能够与Java和 NET互 *** 作 Scala当前版本还不能在 NET上运行(虽然上一版可以) 但按照计划将来可以在 NET上运行
Scala可以与Java互 *** 作 它用scalac这个编译器把源文件编译成Java的class文件(即在JVM上运行的字节码) 你可以从Scala中调用所有的Java类库 也同样可以从Java应用程序中调用Scala的代码 用David Rupp的话来说
它也可以访问现存的数之不尽的Java类库 这让(潜在地)迁移到Scala更加容易
这让Scala得以使用为Java 或者 编写的巨量的Java类库和框架 Scala会经常性地针对这几个版本的Java进行测试 Scala可能也可以在更早版本的Java上运行 但没有经过正式的测试 Scala以BSD许可发布 并且数年前就已经被认为相当稳定了
说了这么多 我们还没有回答一个问题 为什么我要使用Scala? Scala的设计始终贯穿着一个理念
创造一种更好地支持组件的语言 (《The Scala Programming Language》 Donna Malayeri)
也就是说软件应该由可重用的部件构造而成 Scala旨在提供一种编程语言 能够统一和一般化分别来自面向对象和函数式两种不同风格的关键概念
藉著这个目标与设计 Scala得以提供一些出众的特性 包括
面向对象风格
函数式风格
更高层的并发模型
Scala把Erlang风格的基于actor的并发带进了JVM 开发者现在可以利用Scala的actor模型在JVM上设计具伸缩性的并发应用程序 它会自动获得多核心处理器带来的优势 而不必依照复杂的Java线程模型来编写程序
轻量级的函数语法
o 高阶
o 嵌套
o 局部套用(Currying)
o 匿名
与XML集成
o 可在Scala程序中直接书写XML
o 可将XML转换成Scala类
与Java无缝地互 *** 作
Scala的风格和特性已经吸引了大量的开发者 比如Debasish Ghosh就觉得
我已经把玩了Scala好一阵子 可以说我绝对享受这个语言的创新之处
lishixinzhi/Article/program/Java/hx/201311/26873
一、编写第一个用scala写的spark应用:
仿照spark的 quick-start的Self-Contained Applications写出第一个scala完整程序
链接如下:
即:
/ SimpleAppscala /import orgapachesparkSparkContextimport orgapachesparkSparkContext_import orgapachesparkSparkConfobject SimpleApp {
def main(args: Array[String]) {
val logFile = "YOUR_SPARK_HOME/READMEmd" // Should be some file on your system
val conf = new SparkConf()setAppName("Simple Application")
val sc = new SparkContext(conf)
val logData = sctextFile(logFile, 2)cache()
val numAs = logDatafilter(line => linecontains("a"))count()
val numBs = logDatafilter(line => linecontains("b"))count()
println("Lines with a: %s, Lines with b: %s"format(numAs, numBs))
}}
整个程序作用是:找到这个文件
YOUR_SPARK_HOME/READMEmd
中有几个a和几个b。
二、用sbt进行打包成jar:
命令:sbt package
具体步骤见
中的Self-Contained Applications
打包时候几点注意:
1、
目录结构一定要对
目录结构可以通过find 来看
有点类似cmake的感觉
2、
总时间,近30分钟,开始打开会terminal没现象10分钟,然后开始要各种resolve,之后要下载很多库,我这边网速超慢
sbt是个联网编译器,
Spark的应用用到了很多RDD的变换,来编译这些库都得去网上下相应的包
最后显示,编译时间11s
这时成功完成SimpleApp
三、在本机上测试:
命令为:
YOUR_SPARK_HOME/bin/spark-submit \
--class "SimpleApp" \
--master local[4] \
target/scala-210/simple-project_210-10jar
我对jar的理解就是一个可执行文件了,这个可执行文件在JVM上就可以跑了,local中4是指设置成4个线程,但具体原因我也不知道
注意submit的参数:
--class中 SimpleApp是包名
上传的的jar的地址别写错
一、编写第一个用scala写的spark应用:
仿照spark的 quick-start的Self-Contained Applications写出第一个scala完整程序
链接如下:
即:
/ SimpleAppscala /import orgapachesparkSparkContextimport orgapachesparkSparkContext_import orgapachesparkSparkConfobject SimpleApp {
def main(args: Array[String]) {
val logFile = "YOUR_SPARK_HOME/READMEmd" // Should be some file on your system
val conf = new SparkConf()setAppName("Simple Application")
val sc = new SparkContext(conf)
val logData = sctextFile(logFile, 2)cache()
val numAs = logDatafilter(line => linecontains("a"))count()
val numBs = logDatafilter(line => linecontains("b"))count()
println("Lines with a: %s, Lines with b: %s"format(numAs, numBs))
}}
整个程序作用是:找到这个文件
YOUR_SPARK_HOME/READMEmd
中有几个a和几个b。
二、用sbt进行打包成jar:
命令:sbt package
具体步骤见
中的Self-Contained Applications
打包时候几点注意:
1、
目录结构一定要对
目录结构可以通过find 来看
有点类似cmake的感觉
2、
总时间,近30分钟,开始打开会terminal没现象10分钟,然后开始要各种resolve,之后要下载很多库,我这边网速超慢
sbt是个联网编译器,
Spark的应用用到了很多RDD的变换,来编译这些库都得去网上下相应的包
最后显示,编译时间11s
这时成功完成SimpleApp
三、在本机上测试:
命令为:
YOUR_SPARK_HOME/bin/spark-submit \
--class "SimpleApp" \
--master local[4] \
target/scala-210/simple-project_210-10jar
我对jar的理解就是一个可执行文件了,这个可执行文件在JVM上就可以跑了,local中4是指设置成4个线程,但具体原因我也不知道
注意submit的参数:
--class中 SimpleApp是包名
上传的的jar的地址别写错
阅读全文
你是说Scala的type system么?老实说我也没有完全弄懂,更多的时候看看语言参考可能更好。不过就常用的几点可以大致说明下。
1 Java Array & Scala List
用过Java Array的人应该都知道,Java里面有个著名的问题。
String[] strings = {"foo", "bar"};
Object[] objects = strings;
objects[0] = 1; // ArrayStoreException here
编译器无法发现这个类型安全问题。当然这不能完全说是Java的缺陷,因为Java5之前貌似不想写那么多sort(int[] array); sort(float[] array);的话貌似也只能这么干。
这里要引出的是Scala相比引入了协变(covariant)概念。
不可变集合是可协变的,比如List[String] => List[Any]
val strings = List("foo", "bar") // immutable
val objects: List[Any] = strings // OK
可变集合是不可协变的,ListBuffer[String] 不可变成 ListBuffer[Any]
import scalacollectionmutable
val strings = mutableListBuffer("foo", "bar")
val objects: mutableListBuffer[Any] = strings
/
found : scalacollectionmutableListBuffer[String]
required: scalacollectionmutableListBuffer[Any]
Note: String <: Any, but class ListBuffer is invariant in type A
You may wish to investigate a wildcard type such as `_ <: Any` (SLS 3210)
val objects: mutableListBuffer[Any] = strings
/
事实上这样就避免的Java那个问题。
当然如果你要排序的话该怎么办?
def quickSort[A](array: Array[A])(implicit ord: Ordering[A]): Unit = ()
def quickSort[A](list: List[A])(implicit ord: Ordering[A]): List[A] = list
直接用Scala现成的Array[A]和List[A]就行了。
2 Manifest
针对类型擦除的问题,简单来说就是Java和Scala互相调用。直接用Twitter的Scala School上一段例子。
class MakeFoo[A](implicit manifest: Manifest[A]) { def make: A = manifesterasurenewInstanceasInstanceOf[A] }
(new MakeFoo[String])make // return a string ""
3 Pattern Match
在Java中检查类型是很无趣的一件事情,先要isInstanceOf,然后再强制转换,有时候还要SuppressWarning。但是在Scala中,语法层面帮你完成了这个 *** 作。
def contains(x: Int): Boolean = this match {
case Leaf(y) => x == y
case Node(left, right) => leftcontains(x) || rightcontains(x)
}
4 类设计
这可能是一个偏实际的问题,而且并不是说Java下一定没有约束方法。
考虑你设计一个汇率了,必须满足美元只能和美元相加。Scala下你可以这么做
sealed abstract class AbstractCurrency {
type Currency <: AbstractCurrency
def add(that: Currency): Currency
}
class Dollar extends AbstractCurrency {
type Currency = Dollar
def add(that: Dollar): Dollar = { / / }
}
Java下该怎么做呢?熟练的人很快就能想到用接口(抽象类,我又想到Scala下self自我表示语法了),但是无逻辑,很快你就能预见你会增加CurrencyFactory,类型判断等等。因为表达的问题,导致你为了满足约束条件而大量增加代码。有时你只要获取自己的类型判断一下就行,作为OOP你肯定不想那么干。当然大家都是过来人,不会因为这点而认为Java一点都没用,只是大家意识到了Java的OOP表达有限而已。
总的来说,Scala的type system考虑了很多,也相对较难。个人建议可以参考《Programming in Scala》,多看几遍关于类型的部分吧。
以上就是关于Scala编程语言简介全部的内容,包括:Scala编程语言简介、scala程序怎么形成jar包 sbt、如何理解scala可以使得程序更加type-safe等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)