文档章节

scala之函数式编程初探

wiitht
 wiitht
发布于 2017/05/05 17:51
字数 927
阅读 44
收藏 0

    函数式编程(英语:Functional programming)或者函数程序设计,又称泛函编程,是一种编程范式,它将电脑运算视为数学上的函数计算,并且避免使用程序状态以及易变对象。函数编程语言最重要的基础是λ演算(lambda calculus)。而且λ演算的函数可以接受函数当作输入(引数)和输出(传出值)。

从具体的编程语言实现来来看,数据的不变性,一等函数,高等函数,lambda运算,闭包,惰性求值。另外函数式编程大量使用递归,但是递归效率很低,因此出现了尾递归来优化。除了这些通用的特性以外各个编程语言还实现了自己独有的函数式编程特性。   

1.函数简写

如果一个方法仅仅有一个参数,那么就可以不用点号和括号来引用,使用空格分割即可,注意这种方法仅仅适用于类实例方法,并不能在函数中使用;

如果函数仅有一个参数,那么可以使用大括号来代替圆括号。如果使用柯里化,那么所有的函数都可以只有一个参数,这种情况下最后最后一个参数列表才可以这么做。 

object ScalaTest {

  def add(number: Int): Unit = {
    println(number)
  }

  def main(args: Array[String]) {
    ScalaTest add 5 
  }

}
    def compare(x: Int)(y: Int) = if(x>=y) x else y
    val result = compare(1){2}
    val func: Int => Int = compare(1)(_)
    println(result)
    println(func)

2.匿名函数

    val func: Function[Int, Int] = (a: Int) => a  
    println(func(1))

    val add: Int => Int = func(_)
    println(add(1))

 

3.偏函数与currying(柯里化):

偏函数:如果你想定义一个函数,而让它只接受和处理其参数定义域范围内的子集,对于这个参数范围外的参数则抛出异常,这样的函数就是偏函数(顾名思异就是这个函数只处理传入来的部分参数)。

 val pFunc = new PartialFunction[Int, Int] {
      override def isDefinedAt(v1: Int) = v1 > 0
      override def apply(v1: Int): Int = v1 + 1
    }

    val isOdd: PartialFunction[Int, String] = {
         case x if x % 2 == 1 => x +" is odd"
    }
    println(isOdd(3))
    println(pFunc(-1))

结果:
3 is odd
0

currying(柯里化):将原来接受两个参数的函数变成接受一个参数的函数的过程,新函数返回一个以第二个参数作为参数的函数

def mul(x:Int ,y:Int)=x*y
def mul(x:Int)=(y:Int)=>x*y
mul(6)(7)
结果:(y:Int)=>6*y

4.闭包

闭包是为了解决外部能够访问函数内部变量的问题,是沟通内部与外部变量的桥梁;但是不同人对闭包总有不同的看法,严格来说,闭包需要满足三个条件:【1】访问所在作用域;【2】函数嵌套;【3】在所在作用域外被调用

def make(aa: Int) = {
      def other(x: Int) = x + aa
      val more = other _
      more
    }
println(make(1))

5.尾递归是指一个递归的递归语句出现在最后一个地方,注意不能有其他的语句

尾递归在最后递归的地方并没有创建一个新的栈,而是跳转到函数的开头,因此可以大幅度的减小递归调用的开销。

 def boom(x: Int): Int =  
if (x == 0) throw new Exception("boom!")  
 else boom(x-1)+ 1//最后的语句是一个加法  

6.高阶函数:可以接受函数或者返回函数的函数叫做高阶函数。

这儿有一个概念叫做函数的类型,一个函数的类型就是:(参数列表类型)=>返回值类型。实际上Scala包里面定义了几个类来表示函数类型:

 

© 著作权归作者所有

wiitht
粉丝 3
博文 158
码字总数 113941
作品 0
深圳
架构师
私信 提问
Dive Into Kotlin(一):初探 Kotlin

本文由 Prefert 发表在 ScalaCool 团队博客。 在今年的 Google I/O 大会上,Google 宣布在 Android 上为 Kotlin 提供一等支持(转为正房)。 在 Andorid 开发的圈子中,这无疑掀起了轩然大浪...

ScalaCool
2017/11/06
0
0
函数式编程初探

诞生50多年之后,函数式编程(functional programming)开始获得越来越多的关注。 不仅最古老的函数式语言Lisp重获青春,而且新的函数式语言层出不穷,比如Erlang、clojure、Scala、F#等等。...

阮一峰
2012/04/06
0
0
函数式编程初探

诞生 50 多年之后,函数式编程(functional programming)开始获得越来越多的关注。 不仅最古老的函数式语言 Lisp 重获青春,而且新的函数式语言层出不穷,比如 Erlang、clojure、Scala,、F...

墙头草
2012/04/06
4.5K
24
Springboot中使用Scala开发

使用SB與Scala 項目代碼 本章項目代碼: https://github.com/LightSwordSpringBoot/lightsword JVM上的語言家族 JVM上的語言 1)Clojure是一个函数编程语言(functional programming language...

程序员诗人
2016/06/26
0
0
[转]Scala是个有趣的语言

经常读我的博客的人应该知道,我最喜欢的编程语言是Haskell。我喜欢函数式编程,Haskell是一个能把函数式编程推向极致的语言。虽然如此,我仍然时刻关注着其它新兴的和即将产生的编程语言,特...

mj4738
2011/11/01
0
0

没有更多内容

加载失败,请刷新页面

加载更多

GatewayWorker 报错:stream_socket_server(): unable to connect to tcp://0.0.0.0:1238

GatewayWorker 报错:stream_socket_server(): unable to connect to tcp://0.0.0.0:1238 (Address already in use) 官方文档虽然有相同的问题,但是对我的问题没起作用…… 后面发现自己手贱...

wenzhizhong
昨天
0
0
REST接口

文章来源 https://zhuanlan.zhihu.com/p/28674721?group_id=886181549958119424 http://www.ruanyifeng.com/blog/2014/05/restful_api.html REST 对请求的约定 REST 用来规范应用如何在 HTTP......

Airship
昨天
3
0
Spring Cloud Config 统一配置中心

Spring Cloud Config 统一配置中心 一、统一配置中心 统一管理配置 通常,我们会使用配置文件来管理应用的配置。如一个 Spring Boot 的应用,可以将配置信息放在 application.yml 文件中,如...

非摩尔根
昨天
2
0
android ------ AAPT2 error: check logs for details解决方法

AAPT 是全称是 Android Asset Packaging Tool,它是构建 App,甚至是构建 Android 系统都必不可少的一个工具。它的作用是将所有资源文件压缩打包到Android APK 当中。我们在 Android SDK 目录...

切切歆语
昨天
2
0
今天的学习

今天学到了<select></select>标签: <label for="unittype">Select unit type: </label><select id="unittype" name="unittype" autofocus > <option value="1"> Miner </option> ......

墨冥
昨天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部