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. html手机自适应屏幕

    <meta name="viewport" content="height=device-width, initial-scale=1.0, maximum-sca ...

  2. 阿里云域名的ssl证书申请与腾讯服务器域名的证书安装

    阿里云域名中的SSL证书申请,腾讯云服务器中的证书安装: 因为公司的与域名都在阿里云上面,服务器却用的是腾讯云的.记得前2年用阿里云管理平台的时候,域名的SSL证书都很好找,也许是长时间不用,找SSL ...

  3. ML.NET技术研究系列-2聚类算法KMeans

    上一篇博文我们介绍了ML.NET 的入门: ML.NET技术研究系列1-入门篇 本文我们继续,研究分享一下聚类算法k-means. 一.k-means算法简介 k-means算法是一种聚类算法,所谓聚 ...

  4. 动态代理模拟实现aop

    AOP实现起来代码相当简单.主要核心是动态代理和反射. 一.接口类: public interface MethodDao { public void sayHello(); } 二.接口实现类: p ...

  5. idea环境下push项目

    1,选中需要推送的项目: 2,VCS-git-add 添加到本地仓库 3,vcs-commit 提交 4.commit and push 推送到远程仓库 出现错误这是提示程序有错误或者是TODO代码没 ...

  6. vue组件间通信六种方式(完整版)

    本文总结了vue组件间通信的几种方式,如props. $emit/ $on.vuex. $parent / $children. $attrs/ $listeners和provide/inject,以 ...

  7. springcloud-路由Zull

    1. 场景描述 今天接着介绍springcloud,今天介绍下springcloud的路由网关-Zull,外围系统或者用户通过网关访问服务,网关通过注册中心找到对应提供服务的客户端,网关也需要到注册中 ...

  8. kali linux上安装ssh

    1.暂停kali上的ssh进程 root@kali:~# sudo stop ssh 2.卸载ssh服务 root@kali:~# apt-get remove openssh-server 这里可能 ...

  9. C#窗体实现打开关闭VM虚拟机

    vixclass.cs//定义开机.关机等函数 using System; using System.Collections.Generic; using System.Linq; using Sys ...

  10. .NET Core 3.0之深入源码理解HttpClientFactory(一)

    写在前面 创建HttpClient实例的时候,在内部会创建HttpMessageHandler链,我们知道HttpMessageHandler是负责建立连接的抽象处理程序,所以HttpClient的维 ...