经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » Java相关 » Scala » 查看文章
scala-Unit-3-Scala基础语法2
来源:cnblogs  作者:给你一个公主抱  时间:2019/1/14 9:39:31  对本文有异议

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

  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.传值调用:方法传递的是值,详情见如下代码: 

  1. object AntForest {
  2. var energy = 1000
  3.  
  4. def getEnergy():Int={
  5. energy += 50
  6. energy
  7. }
  8.  
  9. def getManyEnergy(x: Int):Unit={
  10. for(a <- 1 to 5){
  11. getEnergy()
  12. println(s"您现在的能量为:$x")
  13. }
  14. println(energy)
  15. }
  16.  
  17. def main(args: Array[String]): Unit = {
  18. getManyEnergy(getEnergy())
  19. }
  20. }

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

 

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

  

  1. object AntForest {
  2. var energy = 1000
  3.  
  4. def getEnergy():Int={
  5. energy += 50
  6. energy
  7. }
  8.  
  9. def getManyEnergy(x: => Int):Unit={
  10. for(a <- 1 to 5){
  11. getEnergy()
  12. println(s"您现在的能量为:$x")
  13. }
  14. println(energy)
  15. }
  16.  
  17. def main(args: Array[String]): Unit = {
  18. getManyEnergy(getEnergy())
  19. }
  20. }

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

 

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

  1.可变参数函数:

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

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

  1. object manyPara {
  2. def sum(ints:Int*):Int={
  3. var sum = 0
  4. for(v <- ints){
  5. sum += v
  6. }
  7. sum
  8. }
  9.  
  10. def setName(params:Any*):Any={
  11. return params
  12. }
  13.  
  14. def main(args: Array[String]): Unit = {
  15. println(sum(1,3,5,7,9))    //25
  16. println(setName("Wyh",23,"man"))  //WrappedArray(Wyh, 23, man)
  17. }
  18. }

  2.默认参数函数:

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

  

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

  

三、高阶函数

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

  1. object higherOrderFunction {
  2. def getPerson(h:Int => String,f:Int):String={
  3. h(f)
  4. }
  5. def Person(x:Int):String= "我是" + x.toString + "岁的帅哥"
  6.  
  7. def main(args: Array[String]): Unit = {
  8. println(getPerson(Person,18))
  9. }
  10. }

  解释:其中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

  代码例子如下:

  1. import java.util.Date
  2.  
  3. object PartParam extends App {
  4. def log(date:Date,message:String):Unit={
  5. println(s"$date,$message")
  6. }
  7.  
  8. val date = new Date()
  9.  
  10. val longMessage = log(date,_:String)
  11. log(date,message = "HelloHunter")  //Wed Jan 09 18:36:51 CST 2019,HelloHunter
  12. longMessage("rebahenmei")      //Wed Jan 09 18:36:51 CST 2019,rebahenmei
  13. }

  解释: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:返回值类型

  偏函数常用于模式匹配

  1. object PartialFunction {
  2. def func1(str:String):Int={
  3. if (str.equals("hunter")) 32 else 18
  4. }
  5.  
  6. def func2:PartialFunction[String,Int]={
  7. //使用偏函数必须使用case
  8. case "hunter" => 32
  9. case _ => 18
  10. }
  11.  
  12. def main(args: Array[String]): Unit = {
  13. println(func1("hunter"))  // 32
  14. println(func1("Wyh"))    //18
  15. println(func2("hunter"))  //32
  16. println(func2("Wyh"))    //18
  17. }
  18. }

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

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号