/**

* 函数可以被简单的被认为是包裹了一条或者几条语句的代码体,该代码体接收若干参数,经过代码体处理后返回结果,形如数学中的f(x) = x + 1

* 在Scala中函数式一等公民,可以向变量一样被传递,被赋值,同时函数可以赋值给变量,变量也可以赋值给函数,之所以可以是这样,原因在于

* 函数背后是类和对象,也就是说在运行的时候函数其实是一个变量!!!当然,背后的类是Scala语言自动帮助我们生成的,且可以天然的被序列化和

* 反序列化,这个意义非常重要:

* 意义1:可以天然的序列化和反序列化的直接好处就是函数可以在分布式系统上传递!!!

* 意义2:因为函数背后其实是类和对象,所以可以和普通的变量完全一样的应用在任何普通变量可以运用的地方,包括作为参数传递,作为返回值,被变赋值和

*      赋值给变量等;

*

* 补充:整个IT编程技术的发展史,其实就是一部封装史:

* 1,Function时代:在C语言中提供了函数的概念,用函数把若干条语句进行封装和复用;

* 2,Class时代:在C++和Java等语言中提供了类和兑现个,把数据和处理数据的业务逻辑封装起来;

* 3,框架时代:把数据、代码和驱动引擎封装起来,是过去10年和未来10年IT技术的核心

*

*

* 关于函数初级入门的几个要点:

* 1,def关键字来定义函数;

* 2,函数会自动进行类型推断来确定函数返回值的类型,如果函数名称和函数体之间没有等于号的话则类型推断失效,此时函数的类型是Unit

* 3,函数的参数可以是函数;

* 4, 如果在函数体中无法推导出函数的类型,则必须声明具体的类型,例如下面的fibonacci;

* 5, 函数的参数可以有默认值,这样在调用函数的时候如果不想改变默认值的话就直接不传递该参数而是直接使用默认值即可,这在实际的编程中意义重大,尤其

*      是在Spark等框架中,因为框架一般都有自己的默认配置和实现,此时我们就可以非常好的使用默认值;

* 6, 我们可以基于函数的参数的名称来调整函数的传递参数的顺序,重点在于为什么可以这么做呢?原因在于函数背后其实是类,其参数就是类的成员,所以无所谓顺序!

* 7, 函数中如果不确定传递参数的个数,可以使用变长参数的方式;传参时候的一个方便的语法是: _*

* 8,可变参数中的数据其实会被收集成为Array数组,我们在入口方面main中其实就是可变参数,是以Array[String]的方式呈现的;

*

*/

 package com.dtspark.scala.basics

 object HelloFunctionalProgramming {

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

     hello("Spark", 30)

     println(hello("Spark", 30))  //函数的参数可以是函数

     val result = fibonacci(5)

     println("fibonacci of 100 = " + result)

     hello("Scala")

     hello(age = 31, name = "dtspark")

     println("Sum = " + sum(1,2,3,4,5,6,7,8,9,10))

     println("Sum = " + sum(1 to 100: _*))

     println("sumrecursive = " + sum(1 to 100: _*))

   }

   def hello(name: String, age: Int = 30) = {

     println("Hello, my name is " + name)

     println("Hello, my age  is " + age)

     age

   }

   def fibonacci(n : Int):Int = {

     if(n <= 1) 1

     else fibonacci(n-2) + fibonacci(n-1)

   }

   def sum(numbers: Int*) = {

     var result = 0

     for(number <- numbers) result += number

     result

   }

   def sumrecursive(numbers:Int*):Int = {

     if(0 == numbers.length ) 0

     else numbers.head + sumrecursive(numbers.tail: _*)

   }

 }

Scala入门之函数的更多相关文章

  1. Scala入门之函数进阶

    /** * 函数式编程进阶: * 1,函数和变量一样作为Scala语言的一等公民,函数可以直接赋值给变量: * 2, 函数更长用的方式是匿名函数,定义的时候只需要说明输入参数的类型和函数体即可,不需要 ...

  2. Scala入门学习笔记三--数组使用

    前言 本篇主要讲Scala的Array.BufferArray.List,更多教程请参考:Scala教程 本篇知识点概括 若长度固定则使用Array,若长度可能有 变化则使用ArrayBuffer 提 ...

  3. Scala入门 【1】

    Scala入门 [1] 转载请注明出处:http://www.cnblogs.com/BYRans/ 1 基础 val定义的为常量,var为变量 val name:Type = ***,变量名后加冒号 ...

  4. Scala 入门详解

    Scala 入门详解 基本语法 Scala 与 Java 的最大区别是:Scala 语句末尾的分号 ; 是可选的 Scala 程序是对象的集合,通过调用彼此的方法来实现消息传递.类,对象,方法,实例变 ...

  5. IntelliJ中的Scala入门

    IntelliJ IDE中的Scala入门 创建项目 打开IntelliJ并单击File => New => Project 在左侧面板中,选择Scala.在右侧面板中,选择IDEA. 将 ...

  6. Scala入门到精通

    原文出自于: http://my.csdn.net/lovehuangjiaju 感谢! 也感谢,http://m.blog.csdn.net/article/details?id=52233484 ...

  7. Scala 深入浅出实战经典 第42讲:scala 泛型类,泛型函数,泛型在spark中的广泛应用

    王家林亲授<DT大数据梦工厂>大数据实战视频 Scala 深入浅出实战经典(1-64讲)完整视频.PPT.代码下载:百度云盘:http://pan.baidu.com/s/1c0noOt6 ...

  8. Swift语法基础入门三(函数, 闭包)

    Swift语法基础入门三(函数, 闭包) 函数: 函数是用来完成特定任务的独立的代码块.你给一个函数起一个合适的名字,用来标识函数做什么,并且当函数需要执行的时候,这个名字会被用于“调用”函数 格式: ...

  9. 快学 Scala 入门 3 部曲

    1 基础 1.1 Scala 解释器 REPL - 交互式解释器环境 R(read).E(evaluate).P(print).L(loop) 输入值,交互式解释器会读取输入内容并对它求值,再返回结果 ...

随机推荐

  1. java统计汉字

    public class TotalUtil { public static int getSum(String text) {        String reg = "^[\u4e00- ...

  2. 在JSP动态网页中输出九九乘法表

    <% StringBuffer sb = new StringBuffer(); ; i <= ; i++){ ; j <= i; j++){ sb.append(j + " ...

  3. 创建一个三角形类,成员变量三边,方法求周长,创建类主类A来测试它

    package com.hanqi.test; public class sanjiaoxing { private double a; private double b; private doubl ...

  4. x01.FileProcessor: 文件处理

    姚贝娜落选,意味着好声音失败.“我们在一起”的精彩亮相,正如同她的歌声,愈唱愈高,直入云霄. 文件处理,无外乎加解密,加解压,分割合并.本着“快舟"精神,花了两天时间,写了个小程序,基本能满 ...

  5. background-position控制背景位置

    提示:需要把 background-attachment 属性设置为 "fixed",才能保证该属性在 Firefox 和 Opera 中正常工作.

  6. jquery 获取设置值、添加元素详解

    jQuery 获取内容和属性 jQuery DOM 操作 jQuery 中非常重要的部分,就是操作 DOM 的能力. jQuery 提供一系列与 DOM 相关的方法,这使访问和操作元素和属性变得很容易 ...

  7. [Computer structure] Written Notes

    To some extent, taking notes using my pen and pencil is also an interesting thing! bingo! ~ 2016-03- ...

  8. java 22 - 18 多线程之 线程的状态转换、线程组

    线程的状态转换图解:图片 线程的线程组: 线程组: 把多个线程组合到一起.    它可以对一批线程进行分类管理,Java允许程序直接对线程组进行控制. 首先创建一个Runnable的实现类 publi ...

  9. java 22 - 4 多线程的代码实现的方式1

    需求:我们要实现多线程的程序. 如何实现呢? 由于线程是依赖进程而存在的,所以我们应该先创建一个进程出来. 而进程是由系统创建的,所以我们应该去调用系统功能创建一个进程. Java是不能直接调用系统功 ...

  10. NOIP2015提高组Day1 Message

    题目描述 有n个同学(编号为1到n)正在玩一个信息传递的游戏.在游戏里每人都有一个固定的信息传递对象,其中,编号为i的同学的信息传递对象是编号为Ti同学. 游戏开始时,每人都只知道自己的生日.之后每一 ...