Scala学习(三)---函数式编程

这篇具有很好参考价值的文章主要介绍了Scala学习(三)---函数式编程。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.面向对象编程

Scala语言是一个完全面向对象的编程语言。万物皆是对象
对象的本质:对数据和行为的一个封装

2. 函数式编程是什么

在解决问题的时候,将问题分解成一个个的步骤,将每一个步骤进行封装(函数),通过调用这些封装好的步骤来解决问题。
Scala语言是一个完全函数式编程的语言。万物皆是函数。
函数的本质:函数可以当成一个值被传递。

3.函数定义

a.函数无参,无返回值

  def fun1(): Unit = {
    println("无返回值")
  }

b.无参,有返回值

    def fun2():String={
      "helloworld"
    }

c.有参,无返回值

      def fun3(name: String):Unit={
      println(s"你好,$name")
    }

d.有参,有返回值

    def fun4(name:String) :String={
      s"我是$name"
    }
    var str1=fun4("mao")
    println(str1)

e.多参,无返回值

    def fun5(name:String,age:Int):Unit={
      println(s"我是$name,今年$age 岁了")
    }

d.多参,有返回值

    def fun6(name:String,age:Int):String={
      s"我是$name,今年$age 岁了"
    }
    var str2=fun6("mao",18);
    println(str2)

4.函数参数的特殊用法

可变参数,在参数后加*

    def sayhi(names:String*):Unit={
      println(s"hi $names")
    }

    sayhi()
    sayhi("zhangsan")
    sayhi("lisi","zhangsan")

Scala学习(三)---函数式编程

如果参数列表中存在多个参数,那么可变参数的位置一般放置在最后

    def sayhi(age:Int,names:String*):Unit={
      println(s"hi $names")
    }

参数默认值,一般将带有默认值的参数放置在参数列表的后面

	//设置参数默认值
    def sayhi(names:String="mao"):Unit={
      println(s"hi $names")
    }
   sayhi()
   //将带有默认值的参数放置在参数列表最后
     def sayhi(names:String,age:Int=31):Unit={
      println(s"hi $names,$age")
    }
   sayhi("mao")

带名参数
如果带有默认值的参数没有放置在参数列表的最后,name在调用函数的时候,需要使用带名参数来调用

   def sayhi(age:Int=31,names:String):Unit={
      println(s"hi $names,$age")
    }
   sayhi(names = "mao")

5.函数至简原则

return可以省略,scala会使用函数体的最后一行代码最为返回值
如果函数体只有一行代码,可以省略花括号
返回值类型如果能够推断出来,那么可以省略(:和返回值类型一起省略)
如果有return,则不能省略返回值类型,必须指定
如果函数明确声明unit,那么即使函数体中使用return关键字也不起作用
scala如果期望是无返回值类型,可以省略等号
如果函数式无参的,但是声明了参数列表,那么在调用的时候,小括号可加可不加
如果函数没有参数列表,那么小括号可以省略,调用时候小括号必须省略
如果不关心名称,只关心逻辑处理,那么函数名(def)可以省略

6.匿名函数

下面就是一个未化简的匿名函数的示例:

    val function1: (String, Int) => String = (name: String, age: Int) => age + name + "heihei"
    val str = function1("mao", 18)
    println(str)

Scala学习(三)---函数式编程
真正的函数是这样的:

def function1(name:String,age:Int):String={
	age+name+"heihei"
}
val str = function1("mao", 18)
println(str)

6.1 匿名函数化简原则

参数的类型可以省略,会根据形参进行自动的推导

    //通过参数的类型推断返回值的类型
    val function2=(name:String)=>name+"heihei"
    //通过返回值的类型推断参数的类型
    val function3:String=>String= (name) => name+"heihei"

类型省略之后,发现只有一个参数,则圆括号可以省略,其他情况:没有参数和参数超过1的永远不能省略圆括号。

 val function3:String=>String= name=> name+"heihei"

匿名函数如果只有一行,则大括号也可以省略
如果参数只出现一次,则参数省略且后面参数也可以用_代替

val function4:(Int,Int)=>Int=2*_+4*_

7.高阶函数

7.1 函数可以作为值进行传递

  def sayHi(name:String) : String={
    println(s"hi $name")
    name
  }

  //此时不是作为值进行传递,而是将方法的返回值传递给了变量
  val mao:String=sayHi("mao")

  //此时才是将函数作为值传递
  val func1: String => String = sayHi _

7.2 函数可以作为参数进行传递

格式如下:
函数(函数名:(参数类型)=>返回值类型):返回值类型={}

//示例:
  def operXY(x: Int, y: Int, func: (Int, Int) => Int): Int = {
    func(x, y)
  }
	//调用函数,使用匿名函数作为参数值
  val countResult: Int = operXY(10, 20, (x: Int, y: Int) => x + y)//或者化简为val countResult: Int = operXY(10, 20,_+_)

  println(countResult)

运行结果:
Scala学习(三)---函数式编程
通过scala语言的此特点,可以极大的简化Java语言手写MapReduce的过程

    def mapreduce(data:String,map: (String)=>Int,reduce:(Int)=>String): String = {
      //使用map读取数据
      val i = map(data)
      //走shuffle
      println("走shuffle流程")
      //对shuffle后的数据进行聚合
      val result:String=reduce(i)
      result
    }
    //调用
    mapreduce("hello world",(data:String)=>data.length,(data:Int)=>data+"reduce之后")

运行结果:
Scala学习(三)---函数式编程

7.3 函数可以作为返回值进行传递

    //函数可以作为返回值进行传递
    def sumXY(x:Int)={
      def sumY(y:Int):Int={
        x+y
      }
      //将内部定义的函数作为返回值进行返回
      sumY _
    }

    //提供第一个累加的数
    val func=sumXY(10)
    //提供第二个累加的数
    val result = func(20)
    println(result)

运行结果:
Scala学习(三)---函数式编程

7.4 柯里化写法

    //2.定于一个函数,传入三个参数c:char,s:String,i:Int
    //如果三个参数为('0',"",0),返回false,否则返回true
    def func1(c:Char):String=>(Int=>Boolean)={
      def func2(s:String):Int=>Boolean={
        def func3(i:Int):Boolean={
          (c!='0'||s!=""||i!=0)
        }
        //将func3作为返回值返回
        func3 _
      }
      //将func2作为返回值返回
      func2 _
    }

    val function:String=>Int=>Boolean = func1('1')
    val function1:Int=>Boolean = function("b")
    val bool:Boolean = function1(10)
    println(bool)

Scala学习(三)---函数式编程
使用柯里化写法对其进行简化:文章来源地址https://www.toymoban.com/news/detail-440379.html

    //柯里化写法
    def function6(c:Char)(s:String)(i:Int):Boolean={
      (c!='0'||s!=""||i!=0)
    }
    //调用
    val bool1 = function6('1')("a")(1)
    println(bool1)

到了这里,关于Scala学习(三)---函数式编程的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【python学习】面向对象编程3

    面向过程编程:类似于工厂的流水线。 优点:逻辑清晰; 缺点:扩展性差。 面向对象编程:核心是对象二字,对象是属性和方法的集合体,面向对象编程就是一堆对象交互。 优点:扩展性强; 缺点:逻辑非常乱。 对象:属性和方法的集合体。 类:一系列相同属性和方法的

    2024年01月22日
    浏览(38)
  • 06-Scala面向对象

    ​ Scala是一门完全面向对象的语言,摒弃了Java中很多不是面向对象的语法。 ​ 虽然如此,但其面向对象思想和 Java的面向对象思想还是一致的 1)基本语法 Scala中基本的package包语法和 Java 完全一致 例如: 2)Scala包的三大作用(和Java一样) 区分相同名字的类 当类很多时,可

    2024年02月07日
    浏览(31)
  • 大数据——Scala面向对象

    案例 定义类表示矩形(Rectangle),提供对外获取周长(girth)和面积(area)的函数,并且为这个矩形类提供一个子类表示正方形(Square) 抽象类和抽象方法 在Scala中,依然是通过 abstract 来定义抽象类。不同的地方在于,Scala中不需要使用 abstract 来定义抽象方法;如果一个方法在定义的

    2024年04月27日
    浏览(27)
  • 【Scala】——面向对象

      Scala 有两种包的管理风格。 第一种 Java 的包管理风格相同,每个源文件一个包(包 名和源文件所在路径不要求必须一致),包名用“.”进行分隔以表示包的层级关系,如 com.atguigu.scala。 另一种风格,通过嵌套的风格表示层级关系,一个源文件中可以声明多个 package,子

    2024年01月25日
    浏览(35)
  • Scala(第六章 面向对象)

    1、 Scala的面向对象思想和Java的面向对象思想和概念是一致的。 2、Scala中语法和Java不同,补充了更多的功能。 1)基本语法 1 2)Scala包的三大作用(和Java一样) 1、区分相同名字的类 2、当类很多时,可以很好的管理类 3、控制访问范围 6.1.1 包的命名 1)命名规则 只能包含数

    2024年02月13日
    浏览(30)
  • Scala之面向对象

    目录 Scala包: 基础语法: Scala包的三大作用: 包名的命名规范: 写包的好处: 包对象: 导包说明: 类和对象: 定义类: 封装: 构造器:  主从构造器的加载机制: 继承: 基础语法: 抽象属性: 多态: Java中的多态测试 Scala测试如下: Scala的面向对象思想和Java是一致的

    2023年04月15日
    浏览(24)
  • Scala之面向对象(2)

    目录 单例对象(伴生对象): 创建对象常用的两种方法: (1)使用构造器构造(new) (2)使用静态方法  伴生对象的定义: apply方法: apply方法的调用: 单例模式: 单例模式分为两种: 1.懒汉式 2.饿汉式:(推荐) 特质(Trait): 基本语法: 说明 特质叠加: 特质和抽象

    2024年02月01日
    浏览(28)
  • Scala面向对象

    组成结构 •构造函数: 在创建对象的时候给属性赋值 •成员变量: •成员方法(函数) •局部变量 •代码块 每个类都有一个主构造器,这个构造器和类定义\\\"交织\\\"在一起类名后面的内容就是主构造器,如果参数列表为空的话,()可以省略 scala的类有且仅有一个主构造器,要想提

    2024年02月09日
    浏览(30)
  • C/C++面向对象(OOP)编程-回调函数详解(回调函数、C/C++异步回调、函数指针)

    本文主要介绍回调函数的使用,包括函数指针、异步回调编程、主要通过详细的例子来指导在异步编程和事件编程中如何使用回调函数来实现。 🎬个人简介:一个全栈工程师的升级之路! 📋个人专栏:C/C++精进之路 🎀CSDN主页 发狂的小花 🌄人生秘诀:学习的本质就是极致

    2024年02月03日
    浏览(29)
  • 8.面向对象编程(中级部分)|Java学习笔记

    删除当前行, 默认是 ctrl + Y 自己配置 ctrl + d 复制当前行, 自己配置 ctrl + alt + 向下光标 补全代码 alt + / 添加注释和取消注释 ctrl + / 【第一次是添加注释,第二次是取消注释】 导入该行需要的类 先配置 auto import , 然后使用 alt+enter 即可 快速格式化代码 ctrl + alt + L 快速运行程序

    2024年02月08日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包