作为参数的函数

scala> val a1 = Array(1,2,3,4)		//这是一个数组
a1: Array[Int] = Array(1, 2, 3, 4) scala> val f1 = (x:Int) => x * 2 //这是一个函数,命名f1
f1: Int => Int = <function1> scala> a1.map(f1) //函数f1可以作为参数使用
res6: Array[Int] = Array(2, 4, 6, 8)

匿名函数

scala> val a1 = Array(1,2,3,4)
a1: Array[Int] = Array(1, 2, 3, 4) scala> a1.map((x:Int) => x * 2) //不给其命名,直接使用称为匿名函数
res7: Array[Int] = Array(2, 4, 6, 8)

柯里化函数(currying)

柯里化(Currying) 是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数且返回结果的新函数的技术。

通俗且不严谨地来说,柯里化函数就是把一个函数的多参数列表拆分为多个单参数列表

//按通常的方法以及调用是下面这样
scala> def m1(x:Int,y:Int) = x+y
m1: (x: Int, y: Int)Int scala> m1(2,3)
res8: Int = 5 //柯里化函数
scala> def m2(x:Int)(y:Int) = x+y
m2: (x: Int)(y: Int)Int scala> m2(2)(3) //柯里化函数这样可以应对一些情况
res10: Int = 5 //比如方法需要拿到两个参数但只拿到一个参数 //实际上就是执行了两次函数调用
scala> m2(2)_
res11: Int => Int = <function1> //m2(2)_会返回一个函数 //调用的时候这样用即可
scala> res11(3)
res12: Int = 5
//可以多次调用,不是一次性的
scala> res11(7)
res13: Int = 9
//柯里化函数的运行机制就像下面这样
scala> def m3(x:Int) = (y:Int) => x+y
m3: (x: Int)Int => Int scala> m3(2)
res14: Int => Int = <function1> scala> res14(3)
res15: Int = 5

闭包函数

闭包就是能够读取其他函数内部变量的函数,也可以认为是对自由变量的捕获

scala> var y = 5	//定义一个变量
y: Int = 5 scala> def m1(x:Int) = x+y //这里只给出了一个参数,但方法是x+y两个参数
m1: (x: Int)Int scala> m1(2) //可以看出这里直接捕获了y变量的值
res16: Int = 7 scala> var y = 2
y: Int = 2 scala> m1(2) //但不会因为变量值的修改而更改
res17: Int = 7

【Scala】用实例弄清楚scala几种函数的定义和特点的更多相关文章

  1. javascript基础之两种函数的定义方法

    第一种方式:可以在函数定义之前调用也可以在函数定义之后调用: (0)函数的调用 add(,) //可以调用 (1)函数的定义: function add(x,y) { console.log(x+y) ...

  2. Scala编程实例:使用List和Tuple

    本文节选自Martin Odersky,Lex Spoon和Bill Venners所著,Regular翻译的<Programming in Scala>的第三章.Scala是一种针对 J ...

  3. SCALA编程实例

    SCALA与JAVA很相似,包括类.函数.集合等等的使用.如果你是一个JAVA程序员,你应该会很快上手. 需要注意的是SCALA特有的一些奇葩标志,比如->,比如=>,遇到要注意下. 使用 ...

  4. Scala 编程(一)Scala 编程总览

    Scala 简介 Scala 属于“可伸展语言”,源于它可以随使用者的需求而改变和成长.Scala 可以应用在很大范围的编程任务上,小到脚本大到建立系统均可以. Scala 跑在标准 Java 平台上 ...

  5. Scala教程之:面向对象的scala

    文章目录 面向对象的scala Unified Types Classes Traits 面向对象的scala 我们知道Scala是一种JVM语言,可以合java无缝衔接,这也就大大的扩展了scala ...

  6. [大数据从入门到放弃系列教程]在IDEA的Java项目里,配置并加入Scala,写出并运行scala的hello world

    [大数据从入门到放弃系列教程]在IDEA的Java项目里,配置并加入Scala,写出并运行scala的hello world 原文链接:http://www.cnblogs.com/blog5277/ ...

  7. Scala系统学习(四):Scala变量

    变量是保存存储值的内存位置的名称.这意味着当创建变量时,可以在内存中保留一些空间. 根据变量的数据类型,编译器分配内存并决定可以存储在预留内存中的内容.因此,通过为变量分配不同的数据类型,可以在这些变 ...

  8. Scala系统学习(一):Scala概述

    Scala是可扩展语言的缩写,是一种混合功能编程语言. 它由Martin Odersky创建. Scala顺利整合面向对象和函数式语言的功能. Scala被编译后在Java虚拟机上运行. 许多现有公司 ...

  9. Scala 系列(一)—— Scala 简介及开发环境配置

    一.Scala简介 1.1 概念 Scala 全称为 Scalable Language,即"可伸缩的语言",之所以这样命名,是因为它的设计目标是希望伴随着用户的需求一起成长.Sc ...

随机推荐

  1. linux知识点系列之 umask

    介绍 umask(user's mask)用来设置文件权限掩码.权限掩码是由3个八进制的数字所组成,将现有的存取权限减掉权限掩码后,即可产生建立文件时预设的权限. UNIX最初实现时不包含umask命 ...

  2. stand up meeting 12/17/2015

    part 组员                今日工作 工作耗时/h 明日计划 工作耗时/h UI 冯晓云  建立基本的pdf阅读器界面框架    4  开始实现界面框架   4 foxit PDF ...

  3. [De1CTF 2019]SSRF Me

    原帖地址 : https://xz.aliyun.com/t/5927 De1CTF 2019 的一个题目总结 题目描述 直接查看页面源代码可以看到正确格式的代码 #! /usr/bin/env py ...

  4. api接口安全

    API接口安全 在做app开发中,如何保证api的接口安全,不被其他app去调用? 接口安全的措施很多,今天记录一个常用的措施 签名: 前台想要调用接口,需要使用几个参数生成签名: 时间戳:当前时间 ...

  5. ElasticSearch的高级复杂查询:非聚合查询和聚合查询

    一.非聚合复杂查询(这儿展示了非聚合复杂查询的常用流程) 查询条件QueryBuilder的构建方法 1.1 精确查询(必须完全匹配上,相当于SQL语句中的“=”) ① 单个匹配 termQuery ...

  6. MySQL的远程链接

    安装好我们的mMySQL,是不是也有种无从下手的感觉,不用怕,接下来我们可以使用远程连接来可视化我们的数据库的数据: 1. 打开我们的数据库,帐号是root,密码查看文件就行了 2.使用命令: mys ...

  7. GOLANG 匿名函数笔记

    在函数内部,没有名字的函数,就是匿名函数 实现方法1: func main(){ a := "我是无参无返回值的匿名函数" x := func(){ //可以获取到匿名函数外部的变 ...

  8. 2019-2020-1 20199308《Linux内核原理与分析》第七周作业

    <Linux内核分析> 第六章 进程的描述和进程的创建 6.1 进程的描述 操作系统内核实现操作系统的三大管理功能: 进程管理(进程)-核心 内存管理(虚拟内存) 文件系统(文件) 为了管 ...

  9. 结构体 偏移量 (size_t)&(((s *)0)->m) , list相关

    在Windows SDK 的stddef.h 中 #define offsetof(s,m) (size_t)&(((s *)0)->m) 应用例如 #define list_conta ...

  10. POJ1475 推箱子---模块化思想

    自古逢秋悲寂寥,我言秋日胜春朝. 晴空一鹤排云上,便引诗情到碧霄. --刘禹锡 题目:推箱子 网址:http://poj.org/problem?id=1475 推箱子游戏相信大家都不陌生,在本题中, ...