Scala既是一门面向对象(OOP)语言,又是一门函数式编程(FP)语言。作为一门支持函数式编程的语言,Scala鼓励面向表达式编程(EOP)模型。简单来说,EOP中每个语句都有返回值。这一模式很明显,因为if/else语句就可以返回值:

val result = if(a > b) a else b
1. 使用函数字面量(匿名函数)
val a = List.range(1,10)
val b = a.filter((i:Int) => i % 2 == 0)
println(b) 结果:
List(2, 4, 6, 8) Process finished with exit code 0

在上面的例子中代码:

(i:Int) => i % 2 == 0

就是匿名函数。

2. 将函数转变为变量
val double = (i:Int) => {i * 2}
println(double(3))
结果:
6

这个时候的变量double是一个实例。在这种情况下他是函数实例你可以像函数一样去调用他。

除了调用,还可以将其传入到任何具有相同参数签名的方法或者函数中:

val double = (i:Int) => {i * 2}
val list = List.range(1,5)
val l =list.map(double)
println(l)
结果: List(2, 4, 6, 8) Process finished with exit code 0

Scala的Unit类:

Unit类和java的Void类似,使用于表明函数无返回值的场景。比如我们定义main函数:

def main(args: Array[String]): Unit = {

}
3. 使用闭包

先看一个例子:

package scope{
class Foo{
def exec(f:String => Unit,name:String): Unit ={
f(name)
}
}
} object claEx extends App{
var hello = "hello"
def sayHello(name:String){println(s"$hello,$name")}
val foo = new scope.Foo
foo.exec(sayHello,"hah")
} 结果:
hello,hah Process finished with exit code 0

关于闭包的定义有很多,有如下的说法,”闭包是满足下面三个条件的一段代码块”:

  1. 代码块可以当作值来传递。
  2. 同时可以被任何拥有该值的对象按需执行。
  3. 可以引用上下文中已经创建的变量(如它的封闭是相对于变量访问,在数学上称之为“关闭”)。

再举一个简单的例子:

object Demo{
def main(args: Array[String]): Unit = {
val newAge = 18
val isMoreThanAge = (age:Int) => age >= newAge
println(isMoreThanAge(3))
println(isMoreThanAge(40))
printResult(isMoreThanAge,33)
} def printResult(f:Int => Boolean,x:Int): Unit ={
println(f(x))
} }
结果: false
true
true Process finished with exit code 0
4.部分应用函数

先看定义:

val sum = (a:Int,b:Int,c:Int) => a+b+c
val f = sum(3,6,_:Int)

在函数调用的时候不提供第三个参数,这个时候函数f就变为部分应用函数。

val sum = (a:Int,b:Int,c:Int) => a+b+c
val f = sum(3,6,_:Int)
println(f.toString())
结果: Demo$$$Lambda$2/1329552164@1b40d5f0

结果表明f是一个Function。因为上面第三个参数为Int类型的空缺值,所以f函数还可以传入一个参数:

println(f(3))
结果:
12

Scala函数式编程(三)的更多相关文章

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

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

  2. Scala函数式编程进阶

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

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

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

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

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

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

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

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

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

  7. Scala函数式编程(六) 懒加载与Stream

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

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

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

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

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

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

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

随机推荐

  1. 设计模式-责任链模式(responsibility)

    责任链模式是行为模式的一种,该模式构造一系列的分别担当不同职责的类的对象(HeaderCar.BodyCar.FooterCar)来共同完成一个任务,这些类的对象之间像链条一样紧密相连. 角色和职责: ...

  2. HDU XXXX:求[L,R]的素数数量(数位DP)

    Problem G Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 131072/131072K (Java/Other) Total S ...

  3. CSDN,CNBLOGS博客文章一键转载插件(转载测试)

    插件地址: https://greasyfork.org/zh-CN/scripts/381053-csdn%E5%8D%9A%E5%AE%A2%E6%96%87%E7%AB%A0%E8%BD%AC% ...

  4. Akka-CQRS(16)- gRPC用JWT进行权限管理

    前面谈过gRPC的SSL/TLS安全机制,发现设置过程比较复杂:比如证书签名:需要服务端.客户端两头都设置等.想想实际上用JWT会更加便捷,而且更安全和功能强大,因为除JWT的加密签名之外还可以把私密 ...

  5. C语言学习书籍推荐《数据结构与算法分析:C语言描述(原书第2版)》下载

    维斯 (作者), 冯舜玺 (译者) <数据结构与算法分析:C语言描述(原书第2版)>内容简介:书中详细介绍了当前流行的论题和新的变化,讨论了算法设计技巧,并在研究算法的性能.效率以及对运行 ...

  6. JavaScript-浏览器的三种弹窗方式

    //BOM 弹窗 //同步 阻断 alert("alert弹窗"); //返回布尔值 (是/否) var bcf = confirm("confirm弹窗"); ...

  7. 利用iisnode模块,让你的Node.js应用跑在Windows系统IIS中

    最近比较喜欢用Node.js做一些简单的应用,一直想要部署到生产环境中,但是手上只有一台windows server 2008服务器,并且已经开启了IIS服务,运行了很多.Net开发的网站,80端口已 ...

  8. MySql突然连接不上,报Can't connect to MySQL server on 'localhost' (10061),并且没有mysqld时解决方案

    今天连接数据库时突然连接不上,前一天还是好好的.打开数据库就报 Can't connect to MySQL server on 'localhost' (10061) 一直也知道是MySQL服务没有 ...

  9. ES6中的解构

    数组中的解构: 输出 : 白板 幺鸡 二条 对象的解构: 输出: 老王 12 数组的结构用[];对象的解构用{}:一定要区分它是数组还是解构. 区分方法:看 它是在赋值还是在拿值,等号左边,都为解构, ...

  10. ServiceFabric极简文档-2 部署环境搭建-配置文件

    类型:ClusterConfig.Unsecure.MultiMachine 说明:至少3台机子 { "name": "SampleCluster", &quo ...