1.作为值的函数

在Scala中,函数和数字一样,可以在变量中存放函数。可以把函数赋值给一个变量,格式为:val foee=fun _(函数名+空格+_)形式

2.匿名函数

在scala中,不需要给每一个函数命名,而是将该匿名函数赋值给一个变量

例如:Array(3,4,5).map((x:Double)=>3*x)

//Array(9,12,15)

在这里,我们告诉map方法,将每个元素乘以3

匿名函数一般格式:(参数1,参数2,...)=>{函数体(代码块)}

3.带函数参数的函数

实现接受另一个函数作为参数的函数

例如:def value(f: (Double)=>Double)=f(0.25)//这里的参数是任何接受Double并返回Double的函数

然后调用:value(sqrt_)//0.5

spark源码中主要是对集合的处理。由于value是一个接受函数参数的函数,因此它被称为高阶函数。

高阶函数也可以产出另一个函数,例如:

def mulBy(factor: Double)=(x: Double)=>factor*x

val quintuple=mulBy(5)

quintple(20)//100

4.函数返回值也是函数

def func(s:String)=(m:String)=>println(s+":"+m)

func("spark")返回的是一个函数,在函数体中,对于输入参数,只使用一个,则输入参数名可以省略,用_(占位符)替代

例如:val array=Array(1,2,3,4)

array.map(2*_).foreach(println)//2,4,6,8

5.闭包,操作作用域,闭包由代码和代码用到的任何非局限变量定义构成

def mulBy(factor: Double)=(x: Double)=>factor* x

考虑如下调用:

val a=mulBy(3)

val b=mulBy(0.5)

println(a(14)+" "+b(14))//42 7

函数在执行完后,再次执行该函数,函数内部参数仍能被访问

6.柯里化:n个参数的函数,被转换成n个函数

例如:def sum(x:Int,y:Int)=x+y

def sum(x:Int)(y:Int)=x+y

7.SVM转换

在scala中,每当需要告诉另一个函数做某事时,就会传一个函数参数给它。Java并不支持函数,java程序员需要付出更多才能达到相同的效果。其通常做法是将动作放在一个实现某接口的类中,然后将该类的一个实例传递给另一个方法。

为了启用这个语法,需要提供隐式转换。

8.集合式函数编程

主要是对List,Set集合的函数操作
val list=List("Scala","Spark","Hadoop")
list.map(_)
list.map(println)
mutable(可变),immutable(不可变)
scala.collection.Map :不可变
scala.collection.mutable.Map:可变
 
实际的一个函数编程例子:
统计一个文件夹下面所有文件中所有单词出现的总次数。
以空格作为单词的分隔符,test文件夹下有两个文本文件1.txt,2.txt
import java.io.File
import scala.io.Source
object SecondJob {
  def main(args: Array[String]): Unit = {
    val dirfile=new File("G:/data/test")
    val files=dirfile.listFiles
    for(file <-files) println(file)
    val listFiles=files.toList
    val wordsMap=scala.collection.mutable.Map[String,Int]()
    listFiles.foreach( file =>Source.fromFile(file).getLines().foreach(line=>line.split(" ").
                  foreach(
                      word=>{
                        if (wordsMap.contains(word)) {
                          wordsMap(word)+=1
                        }else {
                          wordsMap+=(word->1)
                        }
                      }
                  )
            )
 
    )
    println(wordsMap)
    for((key,value)<-wordsMap) println(key+": "+value)
  }
}

scala函数式编程的更多相关文章

  1. Scala函数式编程进阶

    package com.dtspark.scala.basics /** * 函数式编程进阶: * 1,函数和变量一样作为Scala语言的一等公民,函数可以直接赋值给变量: * 2, 函数更长用的方式 ...

  2. Scala函数式编程——近半年的痛并快乐着

    从9月初啃完那本让人痛不欲生却又欲罢不能的<七周七并发模型>,我差不多销声匿迹了整整4个月.这几个月里,除了忙着讨食,便是继续啃另一本"锯著"--<Scala函数 ...

  3. Scala实战高手****第5课:零基础实战Scala函数式编程及Spark源码解析

    Scala函数式编程 ----------------------------------------------------------------------------------------- ...

  4. 9、scala函数式编程-集合操作

    一.集合操作1 1.Scala的集合体系结构 // Scala中的集合体系主要包括:Iterable.Seq.Set.Map.其中Iterable是所有集合trait的根trai.这个结构与Java的 ...

  5. Scala函数式编程(三) scala集合和函数

    前情提要: scala函数式编程(二) scala基础语法介绍 scala函数式编程(二) scala基础语法介绍 前面已经稍微介绍了scala的常用语法以及面向对象的一些简要知识,这次是补充上一章的 ...

  6. Scala函数式编程(四)函数式的数据结构 上

    这次来说说函数式的数据结构是什么样子的,本章会先用一个list来举例子说明,最后给出一个Tree数据结构的练习,放在公众号里面,练习里面给出了基本的结构,但代码是空缺的需要补上,此外还有预留的test ...

  7. Scala函数式编程(四)函数式的数据结构 下

    前情提要 Scala函数式编程指南(一) 函数式思想介绍 scala函数式编程(二) scala基础语法介绍 Scala函数式编程(三) scala集合和函数 Scala函数式编程(四)函数式的数据结 ...

  8. scala 函数式编程之集合操作

    Scala的集合体系结构 // Scala中的集合体系主要包括:Iterable.Seq.Set.Map.其中Iterable是所有集合trait的根trai.这个结构与Java的集合体系非常相似. ...

  9. 大数据笔记(二十五)——Scala函数式编程

    ===================== Scala函数式编程 ======================== 一.Scala中的函数 (*) 函数是Scala中的头等公民,就和数字一样,可以在变 ...

  10. Scala函数式编程(五) 函数式的错误处理

    前情提要 Scala函数式编程指南(一) 函数式思想介绍 scala函数式编程(二) scala基础语法介绍 Scala函数式编程(三) scala集合和函数 Scala函数式编程(四)函数式的数据结 ...

随机推荐

  1. gitlab&fengoffice的ldap配置

    1.fengoffice配置config/ldap_config.php $config_ldap = array ( 'binddn' => 'cn=admin,dc=xxx,dc=xxx', ...

  2. Javascript使用function创建类的两种方法

    1.使用function类 //myFunction.js var CMyFunc=function() { //类的公共方法,供外部调用 this.Func1=function() { var i= ...

  3. hdu 3061 Battle 最大权闭合图

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3061 由于小白同学近期习武十分刻苦,很快被晋升为天策军的统帅.而他上任的第一天,就面对了一场极其困难的 ...

  4. phyreengine 3.12.0 安装遇到的问题

    发现他们文档都是旧的....略渣阿 需要安装vs2012 update4 vs2013update4 nvdia cg toolkits 3.1 以及 windows SDK 8.1 编译运行第一个s ...

  5. PowerDesigner(八)-面向对象模型(用例图,序列图,类图,生成Java源代码及Java源代码生成类图)(转)

    面向对象模型 面向对象模型是利用UML(统一建模语言)的图形来描述系统结构的模型,它从不同角度实现系统的工作状态.这些图形有助于用户,管理人员,系统分析人员,开发人员,测试人员和其他人员之间进行信息交 ...

  6. Sqli-labs less 55

    Less-55 本关的sql语句为: $sql="SELECT * FROM security.users WHERE id=($id) LIMIT 0,1"; 其余和less54 ...

  7. D3D Deferred Shading

    在3D图形计算中,deferred shading是一个基于屏幕空间的着色技术.之所以被称为deferred shading,是因为我们将场景的光照计算与渲染"deferred"到 ...

  8. SEO优化的黑帽手法是否值得使用?

    PR劫持 可能很多人也会听到说,什么网站权重越高越好,这也就是后面越来越多人都对谷歌的PR的宣传看的很重,自建站的都追求PR值,权重越高代表这个网站越受信任. 比如一个新站PR值为0,一个老站PR为6 ...

  9. js获取服务器时间

    Ajax HTTP Head法原理:一般服务器在发送静态页面的时候(apache, nginx, lighttpd就目前所知)都是会在 HTTP 头里带一个Date的头信息的,那么我用Ajax直接取头 ...

  10. 大并发连接的oracle在Linux下内存不足的问题的分析

    大并发连接的oracle在Linux下内存不足的问题的分析 2010-01-28 20:06:21 分类: Oracle 最近一台装有Rhel5.3的40G内存的机器上有一个oracle数据库,数据库 ...