【Scala】用实例弄清楚scala几种函数的定义和特点
文章目录
作为参数的函数
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几种函数的定义和特点的更多相关文章
- javascript基础之两种函数的定义方法
第一种方式:可以在函数定义之前调用也可以在函数定义之后调用: (0)函数的调用 add(,) //可以调用 (1)函数的定义: function add(x,y) { console.log(x+y) ...
- Scala编程实例:使用List和Tuple
本文节选自Martin Odersky,Lex Spoon和Bill Venners所著,Regular翻译的<Programming in Scala>的第三章.Scala是一种针对 J ...
- SCALA编程实例
SCALA与JAVA很相似,包括类.函数.集合等等的使用.如果你是一个JAVA程序员,你应该会很快上手. 需要注意的是SCALA特有的一些奇葩标志,比如->,比如=>,遇到要注意下. 使用 ...
- Scala 编程(一)Scala 编程总览
Scala 简介 Scala 属于“可伸展语言”,源于它可以随使用者的需求而改变和成长.Scala 可以应用在很大范围的编程任务上,小到脚本大到建立系统均可以. Scala 跑在标准 Java 平台上 ...
- Scala教程之:面向对象的scala
文章目录 面向对象的scala Unified Types Classes Traits 面向对象的scala 我们知道Scala是一种JVM语言,可以合java无缝衔接,这也就大大的扩展了scala ...
- [大数据从入门到放弃系列教程]在IDEA的Java项目里,配置并加入Scala,写出并运行scala的hello world
[大数据从入门到放弃系列教程]在IDEA的Java项目里,配置并加入Scala,写出并运行scala的hello world 原文链接:http://www.cnblogs.com/blog5277/ ...
- Scala系统学习(四):Scala变量
变量是保存存储值的内存位置的名称.这意味着当创建变量时,可以在内存中保留一些空间. 根据变量的数据类型,编译器分配内存并决定可以存储在预留内存中的内容.因此,通过为变量分配不同的数据类型,可以在这些变 ...
- Scala系统学习(一):Scala概述
Scala是可扩展语言的缩写,是一种混合功能编程语言. 它由Martin Odersky创建. Scala顺利整合面向对象和函数式语言的功能. Scala被编译后在Java虚拟机上运行. 许多现有公司 ...
- Scala 系列(一)—— Scala 简介及开发环境配置
一.Scala简介 1.1 概念 Scala 全称为 Scalable Language,即"可伸缩的语言",之所以这样命名,是因为它的设计目标是希望伴随着用户的需求一起成长.Sc ...
随机推荐
- paddlehub Test on win10
conda 构建虚拟环境 1)虚拟环境下安装paddlepaddle 1.7 2)pip install paddlehub 3)添加环境变量hub_home,以免模型把c盘撑爆 4)下载的模型在.p ...
- Daily Scrum 12/24/2015
Process: Zhaoyang: Some UI change and compile the Caffe in the IOS. Yandong: Do some code integratio ...
- Daily Scrum 12/23/2015
Process: Zhaoyang: Compile the Caffe IOS version and make it run in the IOS9. Yandong: Finish the Az ...
- A Bug's Life POJ 2492
D - A Bug's Life 二分图 并查集 BackgroundProfessor Hopper is researching the sexual behavior of a rare spe ...
- js多线程的实现
我们都知道JS是一种单线程语言,即使是一些异步的事件也是在JS的主线程上运行的(具体是怎么运行的,可以看我另一篇博客JS代码运行机制).像setTimeout.ajax的异步请求,或者是dom元素的一 ...
- 曹工说Redis源码(7)-- redis server 的周期执行任务,到底要做些啥
文章导航 Redis源码系列的初衷,是帮助我们更好地理解Redis,更懂Redis,而怎么才能懂,光看是不够的,建议跟着下面的这一篇,把环境搭建起来,后续可以自己阅读源码,或者跟着我这边一起阅读.由于 ...
- Linux服务器压力测试总结(CPU、Memory、IO等)
测试工具:sysbench.memtester.htop 1.htop安装使用 yum install ncurses-devel # 安装依赖包 tar zxvf htop-2.2.0.tar.gz ...
- Postman:Pre-request Script
Pre-request Script:前置处理,会在发出请求前执行,主要用在生成一些动态参数. 例如:api接口都会有签名校验,这个校验在我们api测试的时候很不方便,这里可以利用 postman 前 ...
- shiro:集成Springboot(六)
1:导入相关依赖 <!--thymeleaf 模板引擎依赖包--> <dependency> <groupId>org.springframework.boot&l ...
- HBase Filter 过滤器之 Comparator 原理及源码学习
前言:上篇文章HBase Filter 过滤器概述对HBase过滤器的组成及其家谱进行简单介绍,本篇文章主要对HBase过滤器之比较器作一个补充介绍,也算是HBase Filter学习的必备低阶魂技吧 ...