欢迎使用CSDN-markdown编辑器

来源:互联网 发布:以前网络歌手名单大全 编辑:程序博客网 时间:2024/06/04 01:20

函数式编程

  • 函数式编程
    • 概念
      • - 语言支持举例
      • - 举个栗子
      • - 特点
      • - 优点
    • 三个常用函数
      • - filter
      • - map flatmap
      • - reduce

概念

一种编程范式,属于「结构化编程」的一种。强调执行的==结果==而不是执行的过程

- 语言支持举例

  • 支持良好:swift、JavaScript、Python
  • 支持不好:C/C++(C++11以前)、Obj-C(引入 block 以前)、JAVA(8以前)

- 举个栗子

  //过程式  var a = 0  func incrementUnfunctional() -> () {      a += 1  }  incrementUnfunctional()  print(a) // a = 1  //函数式  var a = 0  func incrementFunctional(num: Int) -> Int {      return num + 1  }  a = incrementFunctional(a)  print(a) // a = 1

- 特点

  1. 函数是第一等公民(Frist Class), 支持闭包或者其他值捕获写法

       var print = function(i) { console.log(i); };   [1, 2, 3].forEach(print)
  2. 使用「表达式」而不是「语句」
    • 表达式:有返回值的一个单纯运算过程
    • 语句:执行操作,没有返回值
  3. 没有副作用,即函数不产生运算以外的其他结果
  4. 不修改状态

    function reverse(string) { if (string.length == 0) {   return string; } else {   return reverse(string.substring(1, string.length)) + string.substring(0, 1); }}var str = "Hello, world!";console.log(reverse(str));// !dllow, ollehconsole.log(str);// Hello, world!
  5. 引用透明,即可再现性

- 优点

  1. 减少代码冗余

  2. 接近自然语言

    subtract(multiply(add(1, 2), 2), 4);add(1, 2).multiply(3).subtract(4);merge([1, 2], [3, 4]).sort().search("2")
  3. 方便测试和查错

  4. 易于并发编程

    var s1 = op1();var s2 = op2()lvar s3 = concat(s1, s2);//函数式编程要求保证 op1 不修改变量或系统状态,即 op2 可能用到的状态不会被 op1 修改

三个常用函数

- filter()

用途:[x~1~, x~2~, …, x~n~] -> if (f(x~n~) == true -> [f(x~n1~), f(x~n2~), …]

参数:1.一个集合 2. 一个函数

操作步骤:

  1. 生成一个空集合
  2. 对集合中的每个元素执行函数
  3. 返回值为 true -> 放进新集合,否则丢弃
  4. 返回新的集合
//swiftvar arr = [10, 20, 45, 32, 100]var filteredArray = arr.filter({(money: Int) -> Bool in    return money > 30})print(filteredArray)
//JavaScriptvar filteredArray = arr.filter(function (m) {    return m > 30})console.log(filteredArray)

- map() / flatmap()

用途:[x~1~, x~2~,… x~n~] -> [f(x~1~), f(x~2~), … f(x~n~)]

参数:1. 一个集合 2. 一个函数

操作步骤:

  1. 生成一个空集合
  2. 用函数处理传入集合中的每一个元素,依次插入新集合
  3. 返回新的集合
//swiftvar mappedArray = arr.map{ money in return "\(money)¥"}print(mappedArray)func sqr(x: Int) -> Int{    return x * x}let squares = [0, 1, 2, 3, 4].map(sqr)print(squares) // [0, 1, 4, 9, 16]
//JavaScriptvar mappedArray = arr.map(function (m) {    return m + "$"})console.log(mappedArray)

- reduce()

用途:[x~1~, x~2~, … x~n~] -> [f(f…f(f(x~1~, x~2~), x~3~)…, x~n-1~), x~n~)]

参数:1. 一个集合 2. 一个函数(JS 中最多接受四个参数)3.一个初值(JS 中可不写)

操作步骤:(假设集合中有 m 个元素,函数 f 接受 n 个参数,返回一个 Int,初值为0)

  1. 集合中的前 n-1 个元素和 0 作为参数执行函数 f,获得返回值 r1
  2. 集合中的第 1~n 个元素和 r1 作为参数执行函数 f,获得返回值 r2
  3. 集合中的第 m-n+1 个元素和 r~n-1~ 作为参数执行函数 f,获得返回值 r
  4. r 就是 reduce 方法的返回值
//swiftlet sum = [10, 20, 45, 32, 100].reduce(0) { $0 + $1 }print(sum)
//JavaScriptvar reducedArray = [10, 20, 45, 32, 100].reduce(function (m1, m2) {    return m1 + m2})console.log(reducedArray)
0 0
原创粉丝点击