关闭

Scala高阶函数

标签: scala高阶函数
474人阅读 评论(0) 收藏 举报
分类:

在函数式编程语言中,函数是“头等公民”,可以像任何其他数据类型一样被传递和操作。
因为Scala混合了面向对象和函数式的特性,所以对Scala来说,函数是“头等公民”。

作为值的函数

在Scala中,无法直接操纵方法,只能直接操纵函数,所以需要使用_

import scala.math._

val temp = ceil _
val num = 3.14
println("fun:"+temp(num))   //4.0

temp的类型是(Double)=>Double,意为接受Double参数并返回Double的函数。能够对fun做的有:调用,传递。

val fun = Math.ceil _ //向上取整

//函数作为参数
Array(3.14, 1.42, 2.0).map(fun).foreach(println) //4.0 2.0 2.0 
Array(3.14, 1.42, 2.0).map(fun).foreach(x => print(x+" "))

匿名函数

函数不一定需要名称,可以将匿名函数赋值给变量,也可以当参数传递。

val triple = (x: Double) => 3 * x
Array(3.14, 1.42, 2.0).map( (x: Double) => 3 * x).foreach(x => print(x+" "))        //9.42 4.26 6.0 
println("\n------")
Array(3.14, 1.42, 2.0).map{ (x: Double) => 3 * x }.foreach(x => print(x+" "))
println("\n------")     //9.42 4.26 6.0 

高阶函数

接受函数参数或者是返回函数函数,被称为高阶函数(higher-order function)。

实现一个接受另一个函数为参数的函数:
def high_order_functions( f :(Double) => Double ) = f(0.25)

该函数的类型是:( (Double) => Double ) => Double

println(high_order_functions(Math.ceil _))  //1.0

println(high_order_functions(Math.sqrt _))  //0.5

返回一个函数的函数:

//mulBy可以产出任何两个数相乘的函数
def mulBy(factor : Double) = (x: Double)=> factor * x

val quintuple = mulBy(5)    //返回值:(x: Double) => 5 * x

println(quintuple(20))      //5 * 20

参数(类型)推断

前面有定义高阶函数def valueAtOneQuarter(f: (Double) => Double) = f(0.25)
因为已知参数的类型,所以Scala会尽可能推断出类型,在传入参数时,可以省掉一些内容。

println( high_order_functions( (x: Double) => 3*x) ) //0.75

high_order_functions((x) => 3*x) //已知参数类型,可以省掉Double
high_order_functions(x => 3*x)  //只有一个参数时,可以省去()
high_order_functions( 3 * _ )   //参数只在右侧出现一次,可以用_(占位符)替换

0
0
查看评论

Scala 之 高阶函数

高阶函数式编程讲解及案例
  • sinat_25306771
  • sinat_25306771
  • 2016-05-22 12:53
  • 2547

Scala入门到精通——第十三节 高阶函数

本节主要内容 高阶函数简介 Scala中的常用高阶函数 SAM转换 函数柯里化 偏函数 1. 高阶函数简介 高阶函数主要有两种:一种是将一个函数当做另外一个函数的参数(即函数参数);另外一种是返回值是函数的函数。这两种在本教程的第五节 函数与闭包中已经有所涉及,这里简单地回顾一下: ...
  • lovehuangjiaju
  • lovehuangjiaju
  • 2015-07-28 09:25
  • 14830

scala 自学笔记 高阶函数

作为值得函数 变量中可以存放函数 import scala.math._ val num = 3.14 // Double val fun = ceil _ // (Double) => Double, fun设为ceil函数, _ 意味着确实指这个函数,而不是碰巧忘记参数。 从技术上讲...
  • escaflone
  • escaflone
  • 2015-02-17 11:15
  • 3352

[Scala函数特性系列]——高阶函数

带函数参数的函数由于是一个接受函数参数的函数,故被称为高阶函数,像之前讲到的map()函数就是高阶函数。如下例所示: 上述代码中,apply函数接受一个函数f作为参数,接受一个Int类型的参数,进行f(v)运算,在下面又给出了f具体的定义(layout函数)。   同样的,高...
  • yhao2014
  • yhao2014
  • 2016-02-21 21:25
  • 2567

!!scala 【经典】一步一步推导!!高阶函数,类型推断

--函数返回函数 scala> def fun1(name1:String) = (name2:String) => println(name1+" "+name2) fun1: (name1: String)String => Unit --等号=左边是函数...
  • gdmzlhj1
  • gdmzlhj1
  • 2016-03-01 14:25
  • 592

Scala 高阶函数

介绍Scala高阶函数及常用的高阶函数。
  • yyywyr
  • yyywyr
  • 2015-12-13 11:36
  • 1026

快学Scala第12章----高阶函数

本章要点 在Scala中函数是“头等公民”,就和数字一样; 你可以创建匿名函数,通常还会把它们交给其他函数; 函数参数可以给出需要稍后执行的行为; 许多集合方法都接受函数参数,将函数应用到集合中的值; 有很多语法上的简写让你以简短且易读的方式表达函数参数; 你可以创建操作代码块的函数,它们看上去就像...
  • u010110208
  • u010110208
  • 2016-06-26 22:42
  • 630

scala入门-09 scala高阶函数

scala入门-09 scala高阶函数 scala入门-09 scala高阶函数 scala入门-09 scala高阶函数 scala入门-09 scala高阶函数
  • stark_summer
  • stark_summer
  • 2015-01-13 17:36
  • 17033

快学Scala习题解答—第十二章 高阶函数

12 高阶函数 12.1 编写函数values(fun:(Int)=>Int,low:Int,high:Int),该函数输出一个集合,对应给定区间内给定函数的输入和输出。比如,values(x=>x*x,-5,5)应该产出一个对偶的集合(-5,25),(-4,16),(-3,9),…,(...
  • u012762573
  • u012762573
  • 2015-08-22 21:52
  • 703

Scala的常用高阶函数

// map: 对传入的每个元素都进行映射,返回一个处理后的元素 Array(1, 2, 3, 4, 5).map(2 * _) // foreach: 对传入的每个元素都进行处理,但是没有返回值 (1 to 9).map("*" * _).foreach(prin...
  • tian_qing_lei
  • tian_qing_lei
  • 2017-09-06 23:23
  • 107
    个人资料
    • 访问:499665次
    • 积分:8055
    • 等级:
    • 排名:第3067名
    • 原创:269篇
    • 转载:7篇
    • 译文:0篇
    • 评论:57条
    About Me

    姓名:李国冬
    英文名:wintfru
    GitHub: 点击进入
    Email:liguodongiot@gmail.com
    学校:西南石油大学
    学历:本科
    专注:Java、Hadoop、IOT
    爱好:跑步,NBA,旅游,LOL
    博客专栏
    咚呱哂呱
    好记性不如烂笔头。
    文章分类