Scala 函数式编程进阶 (1)

一,Scala函数式编程有如下几个特点:

**1,函数和变量一样,函数可以直接赋值给变量
2,函数更长使用的方式是匿名函数的方式,定义的时候需要说明输入参数的类型和类型体即可,不需要名称,但如果你要使用的话一般赋值给变量。
3,函数可以作为参数直接传递给函数
4,函数式编程非常强大的地方之一在于:函数的返回值可以是函数。当函数的返回值是函数的时候这时候表明Scala函数实现了闭包!(Scala闭包的内幕是:Scala的函数背后是类和对象,所以,Scala的参数都作为了对象的成员!!!),所以后续都可以访问!!!!这就是Scala闭包的内幕)
5,Currying(柯理化),可以维护变量在内存中的状态,且实现返回函数的链式功能,可以实现非常复杂的算法和逻辑。**

2,用实例展示 Scala函数编程特点:

object functionalProgramming {


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

//       1,函数和变量一样作为Scala语言的一等公民,函数可以直接赋值给变量; 
        def hiBigData(name : String){
          println("Hi"+name)
        }

        val hiData = hiBigData _
        {
         hiData("Spark")
        }

//        2, 函数更长用的方式是匿名函数,定义的时候只需要说明输入参数的类型和函数体即可,不需要名称,但是如果你要使用的话,一般会把这个
//          匿名函数赋值给一个变量(其实是val常量),Spark源码中大量存在这种语法,必须掌握;
        val f = (name : String) => println("Hi" + name)

        f("Kafka")
       /* //3, 函数可以作为参数直接传递给函数,这极大的简化的编程的语法,为什么这样说呢?原因非常简单:
 *      第一:以前Java的方式是new出一个接口实例,并且在接口实例的回调方法callback中来实现业务逻辑,现在是直接把回调方法
 *              callback传递给我的函数,且在函数体中直接使用,这毫无疑问的简化的代码的编写,提升了开发效率;
 *      第二:这种方式非常方便编写负责的业务逻辑和控制逻辑,对于图计算、机器学习、深度学习等而言至关重要;
 *      
 *      函数作为函数的参数传递的编程方式是称之为高阶函数的编程方式,Spark源码和应用程序开发中至少60%都是这种代码,必须务必一定要掌握。*/

        def getName(func : (String) => Unit ,name : String){
          func(name)
        }

        getName(f,"Scala")

        Array(1 to 10 : _*).map((item : Int) => 2*item).foreach{x => println(x)}

         /*4, 函数式编程一个非常强大的地方之一在于函数的返回值可以是函数,当函数的返回类型是函数的时候,这个时候就表明Scala的函数实现了闭包!
 *      Scala闭包的内幕是:Scala的函数背后是类和对象,所以,Scala的参数都作为了对象的成员!!!!!!,所以后续可以继续访问,这就是Scala  
 *      实现闭包的原理内幕!*/

        def funcResult(message : String) = (name : String) => println(message + " : " + name)
//        def funcResult(message : String , name : String){println(message + ": " +name)}
//funcResult("Hello")("Java")  //Currying函数写法, 必须掌握这种写法,只要是复杂的Scala函数式编程代码就一定会使用这种写法

        val result = funcResult("hello")
        result("Java")

      }
}

补充说明:Scala中的下划线到底有多少种应用场景?

1、作为“通配符”,类似Java中的*。如import scala.math._

2、:_*作为一个整体,告诉编译器你希望将某个参数当作参数序列处理!例如val s = sum(1 to 5:_*)就是将1 to 5当作参数序列处理。

3、指代一个集合中的每个元素。例如我们要在一个Array a中筛出偶数,并乘以2,可以用以下办法:
a.filter(%2==0).map(2*)。
又如要对缓冲数组ArrayBuffer b排序,可以这样:
val bSorted = b.sorted(_
4、在元组中,可以用方法_1, _2, _3访问组员。如a._2。其中句点可以用空格替代。

5、使用模式匹配可以用来获取元组的组员,例如
val (first, second, third) = t
但如果不是所有的部件都需要,那么可以在不需要的部件位置上使用。比如上一例中val (first, second, ) = t

6、还有一点,下划线_代表的是某一类型的默认值。
对于Int来说,它是0。
对于Double来说,它是0.0
对于引用类型,它是null。

关于更多下划线操作内容参考:http://my.oschina.net/leejun2005/blog/405305

本博客内容来自于 : 简介: 王家林:DT大数据梦工厂创始人和首席专家. 联系邮箱18610086859@126.com 电话:18610086859 QQ:1740415547 微信号:18610086859

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值