一、定义方法、函数、及方法转换为函数

  1.方法的定义:

    def  方法名(参数1:数据类型,参数2:数据类型...):返回值类型 ={

    }

  2.定义函数:

    val h1 = (a:Int,b:Int) => {a * b}

  3.方法转换为函数(在Windows下的命令行操作)

    def m2(a:Int,b:Int):Int =a + b

    m2 _

    然后系统生产:res6:(Int,Int) => Int =(function2) 

    注释:(function2)表示一个函数,并且有两个参数、  (Int,Int)代表参数列表

  **方法和函数的区别会单独用一片来整理

二、传值调用&传名调用

  什么是函数式编程?  A:方法的参数可以是一个函数的编程模型

  1.传值调用:方法传递的是值,详情见如下代码: 

object AntForest {
var energy = 1000 def getEnergy():Int={
energy += 50
energy
} def getManyEnergy(x: Int):Unit={
for(a <- 1 to 5){
getEnergy()
println(s"您现在的能量为:$x")
}
println(energy)
} def main(args: Array[String]): Unit = {
getManyEnergy(getEnergy())
}
}

  解释:先计算getEnergy的值,将值作为参数放在getManyEnery中使用
    输出结果:
     您现在的能量为:1050
     您现在的能量为:1050
     您现在的能量为:1050
     您现在的能量为:1050
     您现在的能量为:1050
     1300

  2.传名调用:将方法作为函数被其他方法调用,详情见如下代码:

  

object AntForest {
var energy = 1000 def getEnergy():Int={
energy += 50
energy
} def getManyEnergy(x: => Int):Unit={
for(a <- 1 to 5){
getEnergy()
println(s"您现在的能量为:$x")
}
println(energy)
} def main(args: Array[String]): Unit = {
getManyEnergy(getEnergy())
}
}

  解释:将getEnergy作为函数被getManyEnergy调用
    输出结果:
     您现在的能量为:1100
     您现在的能量为:1200
     您现在的能量为:1300
     您现在的能量为:1400
     您现在的能量为:1500
     1500

二、可变参数函数与默认参数函数

  1.可变参数函数:

  Java中可变参数的函数:public static void m1(String...arg){ }

  Scala中可变参数函数:def sum(ints:Int*):Unit={ }

object manyPara {
def sum(ints:Int*):Int={
var sum = 0
for(v <- ints){
sum += v
}
sum
} def setName(params:Any*):Any={
return params
} def main(args: Array[String]): Unit = {
println(sum(1,3,5,7,9))    //25
println(setName("Wyh",23,"man"))  //WrappedArray(Wyh, 23, man)
}
}

  2.默认参数函数:

  如果传递了参数,测试用传递的值。如果不传递参数,测试用默认值

  

object defaultParam {
def sum(a:Int=3,b:Int=7):Int={
a+b
} def main(args: Array[String]): Unit = {
println(sum()) //10
println(sum(1,5)) //6
}
}

  

三、高阶函数

  定义:将其他函数作为参数,或其结果是函数的函数 

object higherOrderFunction {
def getPerson(h:Int => String,f:Int):String={
h(f)
}
def Person(x:Int):String= "我是" + x.toString + "岁的帅哥" def main(args: Array[String]): Unit = {
println(getPerson(Person,18))
}
}

  解释:其中getPerson方法的参数为一个函数h、一个变量f,执行体为参数为f的函数h,h(f),

    在main方法中getPerson方法将Person方法变为函数,与变量18作为参数,

  执行输出:我是18岁的帅哥

四、字符串的格式化输出

  常规输出方式:val name = "hunter" 

         var age = 18

         println("name:" + name ",age:" + age)

  格式化输出:文字插值器(f、s)

    println(f"name = $name,age = $age")  println(s"name = $name. age = $age")

    println(f"1 + 1 = ${1+1}")        println(s"1 + 1 = ${1+1}")

五、部分参数应用函数

  如果函数传递所有预期的参数,则表示完全应用了它;

  如果只传递了所有参数当中的几个,那么见返回部分应用的函数。

  eg.命令行操作:

    val sum = (a:Int,b:Int) => a+b

    val sum1 = sum(1,_:Int)

    println(sum1(4))    //输出5

  代码例子如下:

import java.util.Date

object PartParam extends App {
def log(date:Date,message:String):Unit={
println(s"$date,$message")
} val date = new Date() val longMessage = log(date,_:String) log(date,message = "HelloHunter")  //Wed Jan 09 18:36:51 CST 2019,HelloHunter
longMessage("rebahenmei")      //Wed Jan 09 18:36:51 CST 2019,rebahenmei
}

  解释:1.使用日期Date要导入java的util包。

     2.App为Scala中的一个特质,可以不写main方法直接运行程序(如Java中的Test、Before)

六、柯理化

  将原来接受的两个参数的函数变为一个新的接收一个参数的函数的过程叫做柯理化

  eg.

    def sum(a:Int,b:Int) = a+b

    def sum(s:Int)(b:Int) = a+b

  这两个方法是等价的。柯理化可将函数的通用性降低,适用性提高。

  通用性:适用于所有或者很多的情况

  适用性:适用于一种或几种的情况

七、偏函数

  被包裹在花阔内没有match的一组case语句,是一个偏函数

  PartialFunction[A,B]

  A;参数类型    B:返回值类型

  偏函数常用于模式匹配

object PartialFunction {
def func1(str:String):Int={
if (str.equals("hunter")) 32 else 18
} def func2:PartialFunction[String,Int]={
//使用偏函数必须使用case
case "hunter" => 32
case _ => 18
} def main(args: Array[String]): Unit = {
println(func1("hunter"))  // 32
println(func1("Wyh"))    //18
println(func2("hunter"))  //32
println(func2("Wyh"))    //18
}
}

  偏函数类似于Java中的swtich/case语句。

scala-Unit-3-Scala基础语法2的更多相关文章

  1. Spark入门到精通--(第二节)Scala编程详解基础语法

    Scala是什么? Scala是以实现scaleable language为初衷设计出来的一门语言.官方中,称它是object-oriented language和functional languag ...

  2. Scala - 快速学习03 - 基础语法

    1- 变量 变量 mutable variable 在程序运行过程中其值可能发生改变的量 关键词var定义变量,定义时直接进行求值 常量 immutable variable 在程序运行过程中其值不会 ...

  3. Scala(二)——基础语法(与Java的区分)和函数式编程

    Scala快速入门(二) 一.键盘输入 关于基本类型的运算,以及复制运算,条件运算,运算符等知识,均和Java语言一样,这里不过多叙述. val name = StdIn.readLine() Std ...

  4. Scala学习教程笔记一之基础语法,条件控制,循环控制,函数,数组,集合

    前言:Scala的安装教程:http://www.cnblogs.com/biehongli/p/8065679.html 1:Scala之基础语法学习笔记: :声明val变量:可以使用val来声明变 ...

  5. 【Scala学习之一】 Scala基础语法

    环境 虚拟机:VMware 10 Linux版本:CentOS-6.5-x86_64 客户端:Xshell4 FTP:Xftp4 jdk1.8 scala-2.10.4(依赖jdk1.8) spark ...

  6. Scala简介及基础语法

    一.scala简介 官网:https://www.scala-lang.org/ Scala语言很强大,集成了面向对象和函数式编程的特点. 运行在JVM(jdk). 大数据中为什么学习scala? s ...

  7. 1.scala基础语法总结

    Scala基础语法总结:Scala 与 Java 的最大区别是:Scala 语句末尾的分号 ; 是可选的.如果一行里写多个语句那么分号是需要的 val s = "菜鸟教程"; pr ...

  8. Scala学习(一)——基础语法

    Scala语言是一种面向对象语言,结合了命令式(imperative)和函数式(functional)编程风格,其设计理念是创造一种更好地支持组件的语言. 特性 多范式(Multi-Paradigm) ...

  9. Scala基础语法 (一)

    如果你之前是一名 Java 程序员,并了解 Java 语言的基础知识,那么你能很快学会 Scala 的基础语法. Scala 与 Java 的最大区别是:Scala 语句末尾的分号 ; 是可选的. 我 ...

  10. Scala入门系列(一):基础语法

    Scala基础语法 Scala与JAVA的关系 Scala是基于Java虚拟机,也就是JVM的一门编程语言,所有Scala的代码都需要经过编译为字节码,然后交由Java虚拟机来运行. 所以Scala和 ...

随机推荐

  1. Confluence 6 使用 CSS 样式化 Confluence 的介绍

    这个页面对 Confluence 通过修改 CSS 来改变外观和感觉的情况进行了说明. 层叠样式表(Cascading Style Sheets (CSS))是对 Web 页面进行样式化的工业化标准. ...

  2. vuex action 与mutations 的区别

    面试没说清楚.这个太丢人回来整理下: 事实上在 vuex 里面 actions 只是一个架构性的概念,并不是必须的,说到底只是一个函数,你在里面想干嘛都可以,只要最后触发 mutation 就行.异步 ...

  3. Netty简单聊天室

    1.创建maven项目,在pom.xml中引入netty的jar包 <project xmlns="http://maven.apache.org/POM/4.0.0" xm ...

  4. Vue中使用Vue.component定义两个全局组件,用单标签应用组件时,只显示一个组件的问题和 $emit的使用。

    解决方法: 定义了两个 Vue.component 在 el 中使用的时候要用 双标签, 用单表标签的时候,只会显示第个 组件间 这样写只显示 welcome-button 组件 <welcom ...

  5. MySQL 5.7的多源复制

    MySQL 5.7已经开始支持了多源复制,相信小伙们都很激动,MySQL 5.7之前只能实现一主一从.一主多从或者多主多从的复制,如果想实现多主一从的复制,只好使用MariaDB,但是MariaDB又 ...

  6. Python中对文件和目录的操作

    用到的核心模块有:os   shutil 文件的创建:f = open("文件名", "w")  注:如果涉及到乱码问题需要在后面加上encoding=&quo ...

  7. Task.Run()任务执行

    1)Task本身就是异步执行的(4.5的那个类). 2)控制数量和终止线程问题可以考虑这个模式: static async void RunAsync() { CancellationTokenSou ...

  8. python---通过递归和动态规划策略解决找零钱问题

    也是常见套路. # coding = utf-8 def rec_mc(coin_value_list, change, know_results): min_coins = change if ch ...

  9. hbase启动后HMaster进程自动关闭

    1.情况描述如题所示,hbase启动以后,HMaster进程启动了,几秒钟以后自动关闭,但是HRegionServer进程正常运行: 原因是,hdfs的默认端口号是8020,而我core-site.x ...

  10. 一脸懵逼学习KafKa集群的安装搭建--(一种高吞吐量的分布式发布订阅消息系统)

    kafka的前言知识: :Kafka是什么? 在流式计算中,Kafka一般用来缓存数据,Storm通过消费Kafka的数据进行计算.kafka是一个生产-消费模型. Producer:生产者,只负责数 ...