函数式编程、链式编程

本文首发于公众号【程序员华仔】

-----------------------

在iOS开发过程中,经常会遇到标题所说的名称。什么是函数式编程、链式编程?相信很多人都似懂非懂。今天我们就来聊一聊这两个问题。

什么是函数式编程?

函数式编程(Funcation Progrmamming),简称FP, 是一种编程范式。具体来说就是每一个函数都是由子函数组成,函数的参数是函数,函数返回值也是函数。一句话来说,大部分是函数。

举个对比的样例说明:

//命令式编程

var a = b + c

print(a)

//函数式编程

print(b+c)

注:

1.函数式编程大部分使用函数,极少使用变量。

2.命令式编程也叫指令编程,以指令为主。我们常说的面向过程和面向对象编程都是属于这一类。显著特点就是很多变量。

函数式编程的历史

函数式编程最早使用在1958年出来的LISP开发语言,较现代的就包括Haskell、Clean、Erlang和Miranda等开发语言。LISP语言还略听过,后面几种语言,编者也没有听过。不过现在流行的Python和Swift语言也属于函数式编程的范畴。

这里有个思维的转变,对于现代编程语言来说,其实也就是Swift语言,它没有早期语言如C语言,那样类型固定了。一般地,早期语言如C语言,被叫做面向过程编程语言,而Swift语言可以说是面向对象编程语言,也可以说是面向协议编程,还可以说是面向函数编程。这样的划分是没有问题的,只是从不同角度看待罢了。

函数式编程的特性

1.没有赋值,也没有for循环 

变量值是不可变的,对于值的操作并不是修改原来的值,而是修改新产生的值;

同样由于变量不可变,函数编程语言无法实现循环。若要实现循环只能通过递归调用。

2.支持Lambda表达式

函数式编程支持Lambda表达式。使用“匿名函数”方式(即lambda 函数可以直接嵌入到行内使用,不需要事先指定名称),将匿名函数赋值给变量,它的行为与正常函数完全一样,使用起来简单易读。

3.内置模板函数

函数式风格尽量避免使用变量,达到‘纯’函数,那么针对于,仅仅为了控制流程而定义的循环变量和流程中产生的临时变量是没有必要的。

4.函数作为返回值

函数返回通常与闭包一起使用。闭包就是能够读取其他函数内部变量的函数。闭包可以理解为一个函数内部的函数。

函数式编程的特点

1.模块化

函数式编程一个实用的优点是,它要求把问题拆分为更小的模块,实现系统的模块化。相对于一个复杂的系统来说,一个个小的模块更明确、更易于编写、也更易于阅读和检查错误。

2.易于调试

由于实现了函数级别的模块化。对于调试来说,就更加具体和明确了。当程序出现问题时,通过检查函数的输入输出,就分析和定位可能出问题的地方了。

3.组合性

前面也提到,函数包括函数的参数和返回值都可以使用函数嵌套,那么小函数就很方便组合成新的功能。

函数式编程与面向对象式编程的区别

共同之处:

解决同一个问题的不同方式。

区别:

1.对于计算机程序常用的“数据”和“操作”来说,在FP中,这两者通常由值和函数来表示;在OOP中,一般用对象和类来表示。

2.FP对问题的分解是由操作驱动的,即把它分解成多个函数,然后在函数内部分别处理不同的数据类型。

OOP对问题的分解是由数据驱动的,即把问题分解成不同的由数据主导的类,然后在类里定义方法以实现需要的功能。

3.FP 定义简单,调用简单;OOP 定义复杂/调用复杂(要建立类,实例对象)。

  

小结

1. 函数式编程是一种不同于其他编程的编程范式,是处理和解决问题的不同方式。了解和掌握这个范式,是非常有必要的,更何况Swift属于函数式编程范式。

2.函数式编程正如上文所说“简单”。但是真的一个系统全是使用函数实现的话,还真的不简单。想想满屏的函数,不见变量,那是什么样的情景。

3.现在市面上很少以纯粹的面向函数式编程的系统,大部分都是混合多种编程范式。一般函数式编程运用在底层库,例如C\C++标准库。

4. Swift语言 在面向函数编程上的具体实例是,map, reduce, filter, flatmap这类数学函数式。

链式编程

链式编程是采用多个操作通过点号"."链接在一起的编程范式,这种范式使代码结构更加的简洁和方便。

基本原则是,每个操作完成后都会返回一个this对象,也就是返回对象本身,否则就不能链接在一起的。

例如:

StringBuffer builder = new StringBuffer()

builder.append("blake")

       .append("bob")

       .append("alice")

       .append("linese")

       .append("eve");

相对来说,链式编程就简单和容易理解多了。这个编程在Java和Swift中使用比较多。Object-C相对少一些。

以上就是我对函数式编程和链式编程这两个概念的理解。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
函数式编程是一种编程范式,它强调使用纯函数来构建程序,避免可变状态和副作用。Java从8版本开始引入了一些函数式编程的相关API,其中包括以下几个方面: 1. Lambda表达式:Lambda表达式是Java函数式编程的核心特性之一。它允许我们以更简洁的语法编写匿名函数,这样可以更方便地传递函数作为参数、以及在方法内部定义函数。 2. Stream API:Stream API提供了一种基于流的编程模型,可以对集合数据进行功能组合、过滤、映射等操作。Stream API支持链式调用,使得代码更简洁、易读。例如,我们可以通过`filter`方法来过滤符合条件的元素,通过`map`方法进行元素映射,以及通过`reduce`方法对集合进行聚合操作。 3. Optional类:Optional类是Java 8中引入的,用于解决空指针异常的问题。它封装了一个可能为空的值,提供了一系列的方法来处理空值情况,例如`ifPresent`方法用于判断是否存在值,`orElse`方法用于获取默认值等。 4. 函数接口:函数接口是一种只有一个抽象方法的接口,可以通过Lambda表达式来实现。Java 8提供了一些内置的函数接口,如`Consumer`、`Supplier`、`Predicate`等,用于在函数式编程中作为参数或返回值使用。 总结而言,Java在8版本开始引入了一些函数式编程的相关API,包括Lambda表达式、Stream API、Optional类和函数接口等。这些API的引入使得Java语言函数式编程方面具备了更多的便利性和灵活性,可以更高效地处理集合数据和复杂的业务逻辑。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员华仔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值