scala入门教程


使用Eclipse 4.5 + Maven 3 打包Scala/Spark项目

http://blog.csdn.net/fz1989/article/details/50499389

Exception in thread "main" java.lang.NoClassDefFoundError: scala/Predef

是由于没有添加 Scala-Library类导致的。

scala中的部分应用函数和偏函数的区别

http://blog.csdn.net/bluishglc/article/details/50995939

高阶函数

参考链接: http://www.jianshu.com/p/5eb84e76ca6f

在数学和计算机科学中,高阶函数是至少满足下列一个条件的函数:

- 接受一个或多个函数作为输入
- 输出一个函数

在数学中它们也叫做算子(运算符)或泛函。微积分中的导数就是常见的例子,因为它映射一个函数到另一个函数。
假设有一个函数对给定两个数区间中的所有整数求和:
def sumInts(a: Int, b: Int): Int = 
if(a > b) 0 else a + sumInts(a + 1, b)
如果现在要求连续整数的平方和:
def square(x: Int): Int = x * x 
def sumSquares(a: Int, b: Int): Int = 
    if(a > b) 0 else square(a) + sumSquares(a + 1, b)
如果要计算2的幂次的和:
def powerOfTwo(x: Int): Int = 
if(x == 0) 1 else 2 * powerOfTwo(x-1)

def sumPowersOfTwo(a: Int, b: Int): Int = 
if(a > b) 0 else powerOfTwo(a) + sumPowersOfTwo(a+1, b)
上面的函数都是从a到b的f(n)的累加形式,我们可以抽取这些函数中共同的部分重新编写函数sum,其中定义的f作为一个参数传入到高阶函数sum中:
def sum(f: Int => Int, a: Int, b: Int): Int = 
  if(a > b) 0 else f(a) + sum(f, a+1, b)

def id(x: Int): Int = x
def square(x: Int): Int = x * x
def powerOfTwo(x: Int): Int = if(x == 0) 1 else 2 * powerOfTwo(x-1)

def sumInts(a: Int, b: Int): Int = sum(id, a, b)
def sumSquared(a: Int, b: Int): Int = sum(square, a, b)
def sumPowersOfTwo(a: Int, b: Int): Int = sum(powerOfTwo, a, b)

Note:这就是高阶函数,给编程带来了很强的抽象能力,一般java代码是无法在这种场景下提供抽象的。 这就使得代码变得非常简单。也使得代码具备了高度可重用性。

有用的高阶函数:

map方法将一个函数应用到某个集合的所有元素并返回结果;foreach将函数应用到每个元素。

//打印三角形
scala> (1 to 9).map("^" * _).foreach(println _)
^
^^
^^^
^^^^
^^^^^
^^^^^^
^^^^^^^
^^^^^^^^
^^^^^^^^^

filter方法输出所有匹配某个特定条件的元素:

scala> (1 to 9).filter(_ % 2 == 0)
res14: scala.collection.immutable.IndexedSeq[Int] = Vector(2, 4, 6, 8)

柯里化

柯里化(Currying)指的是将原来接受两个参数的函数变成新的接受一个参数的函数的过程。新的函数返回一个以原有第二个参数为参数的函数。

形式1:返回函数的函数形式

def sum(f: Int => Int): (Int, Int) => Int = {
    def sumF(a: Int, b: Int): Int = 
        if(a > b) 0
        else f(a) + sumF(a+1, b)

    sumF
}

//于是得到如下定义,这样就简化了参数
def sumInts = sum(x => x)
def sumSquared = sum(x => x * x)
def sumPowersOfTwo = sum(powerOfTwo)

//注意:这里实际上已经是柯里化了。

形式2:

def sum(f: Int => Int)(a: Int, b: Int): Int = 
if(a > b) 0 else f(a) + sum(f)(a + 1, b)

这样调用:
sum(square)(1, 10) 

//注意:这里是柯里化的多个参数列表形式,很多人认为只有这是柯里化,其实上面和这种都是柯里化函数

一般的,多参数函数定义为def f(args1)...(argsn) = E,
当n > 1时,等同于def f(args1)...(args n-1) = {def g(argsn) = E; g}或者def f(args1)...(args n-1) = (argsn => E)。
如果重复这个过程n次,得到def f = (args1 => (args2 => ... (argsn => E) ) )。
这种函数定义称为柯里化(Currying)。

柯里化函数的定义 和 理解

柯里化是将原来需要多个参数的函数,转换成只需一个参数(第一个参数),并且函数的返回值是一个函数,该函数的参数是原函数的除第一个参数以外的参数。

我们来看如下例子:

def mul(x : Int , y : Int) = x * y

定义了一个乘法运算的函数,我们在定义一个函数

 def mulOne(x : Int) = (y : Int ) => x * y

该函数就是mul的柯里化函数

还有多参数形式

def curring(x : Int)(y : Int) = x * y

柯里化的意义在于提高了函数编程的抽象能力

ServiceFramwork

https://github.com/allwefantasy/ServiceFramework

web开发框架

ServiceFramworkDispatcher

https://github.com/allwefantasy/ServiceframeworkDispatcher

scala eclipse如何自动import

scalajava spark

如何能像Java那样将鼠标放到sqrt出现提示自动,并import?

解决方案1:
Ctrl+Alt+O

解决方案2:
请换用idea 并装上scala插件 会非常的方便

Scala 隐式转换

http://www.cnblogs.com/rollenholt/p/4118567.html

scala中的sealed关键字

sealed关键字可以修饰类和特质(特质)。密封类提供了一种约束:不能在类定义的文件之外定义任何新的子类。

http://www.jianshu.com/p/3dd9b53801b0

scala sbt项目构建

sbt介绍与构建Scala项目
http://www.cnblogs.com/codingexperience/p/5372617.html

一、sbt简介

sbt是类似ANT、MAVEN的构建工具,全称为Simple build tool,是Scala事实上的标准构建工具。

主要特性:

原生支持编译Scala代码和与诸多Scala测试框架进行交互;
使用Scala编写的DSL(领域特定语言)构建描述
使用Ivy作为库管理工具
持续编译、测试和部署
整合scala解释器快速迭代和调试
支持Java与Scala混合的项目

二、sbt安装

在sbt官网下载,这里我是下载的sbt-0.13.11.zip,下载后加压到自己定义的文件夹,然后将解压目录的bin目录加入PATH环境

Linux环境,使用sudo vim /etc/profile打开配置文件,添加下面的命令

export SBTHOME=/opt/sbt export path=path:$SBTHOME/bin

执行sbt

sbt [info] Loading global plugins from C:\Users\test.sbt\0.13\plugins [info] Set current project to test(in build file:/C:/Users/test/)

三、sbt的简单配置

配置ivy目录

可以对sbt进行配置,能够配置ivy的文件目录,ivy是sbt的默认管理项目依赖工具,它默认是在user home下建立library repository,但用户可以配置ivy的library local repository。

修改sbt配置文件: [sbt安装目录]/conf/sbtconfig.txt,在配置文件中添加一行

-Dsbt.ivy.home=[你自己挑选的目录]/repository

配置库

感觉sbt运行时会从maven官网下载大量的jar包,可能会非常缓慢,可以添加国内的maven库,从而能够加快运行速度,在”~/.sbt”下创建repositories文件,添加下面的内容

[repositories]
local                 
maven-local: file://~/.m2/repository     
osc: http://maven.oschina.net/content/groups/public/
typesafe: http://repo.typesafe.com/typesafe/ivy-releases/, [organization]/[module]/(scala_[scalaVersion]/)(sbt_[sbtVersion]/)[revision]/[type]s/[artifact](-[classifier]).[ext], bootOnly
sonatype-oss-releases
maven-central
sonatype-oss-snapshots

配置插件

sbt有自己的插件,这里介绍能够生成eclipse目录的插件:sbteclipse插件https://github.com/typesafehub/sbteclipse。

添加sbteclipse插件可以通过两种方式添加:

配置全局文件:~/.sbt/0.13/plugins/plugins.sbt
配置项目文件: PROJECT_DIR/project/plugins.sbt
在其中一个文件添加一行

addSbtPlugin("com.typesafe.sbteclipse" % "sbteclipse-plugin" % "4.0.0")
安装sbteclipse插件后可以在sbt交互界面使用`eclipse`命令生成eclipse项目

四、sbt构建Scala项目

简单构建Scala项目

创建文件SimpleProject/hw.scala

object Hi{
  def main(args: Array[String]) = println("Hello world!")
}

sbt run

Scala maven

https://www.iteblog.com/archives/1370.html

Scala 文件操作

http://blog.csdn.net/yizheyouye/article/details/49183265

Scala 环境搭建

安装 scala 语言
配置idea scala jdk选择 2.11版本
创建maven工程,配置pom文件