项目github地址:bitcarmanlee easy-algorithm-interview-and-practice
欢迎大家star,留言,一起学习进步

1.函数式编程带来的好处

函数式编程近些年异军突起,又重新回到了人们的视线,并得到蓬勃发展。总结起来,无外乎如下好处:
1.减少了可变量(Immutable Variable)的声明,程序更为安全。
2.相比命令式编程,少了非常多的状态变量的声明与维护,天然适合高并发多现成并行计算等任务,这也是函数是编程近年又大热的重要原因。
3.代码更为简洁,可读性更强,对强迫症的同学来说是个重大福音。

2.函数式编程的本质

函数式编程中的函数这个术语不是指计算机中的函数(实际上是Subroutine),而是指数学中的函数,即自变量的映射。也就是说一个函数的值仅决定于函数参数的值,不依赖其他状态。比如sqrt(x)函数计算x的平方根,只要x不变,不论什么时候调用,调用几次,值都是不变的。

引用知乎上的一段描述:
纯函数式编程语言中的变量也不是命令式编程语言中的变量,即存储状态的单元,而是代数中的变量,即一个值的名称。变量的值是不可变的(immutable),也就是说不允许像命令式编程语言中那样多次给一个变量赋值。比如说在命令式编程语言我们写“x = x + 1”,这依赖可变状态的事实,拿给程序员看说是对的,但拿给数学家看,却被认为这个等式为假。

函数式语言的如条件语句,循环语句也不是命令式编程语言中的控制语句,而是函数的语法糖,比如在Scala语言中,if else不是语句而是三元运算符,是有返回值的。

3.实例

1.集合中包含某一个元素

经常有判断集合是否包含某一元素的需求。在命令式编程中,我们一般都会这么干:

public class IfExists {public static void traditional() {boolean flag = false;String[] citys = {"bj","sh","gz","sz"};for(String city:citys) {if(city.equals("bj")) {flag = true;break;}}System.out.println(flag);}public static void main(String[] args) {traditional();}
}

这段代码正常工作肯定是没有问题的。而且逻辑本身也很简单,大家都能写出来。但是在我看来,是不是太长了。。。

看看我们用scala实现一下

object IfExists{def main(args: Array[String]): Unit = {println(Array("bj","sh","gz","sz").contains("bj"))}
}

直接针对集合进行操作,省去了讨厌的循环判断等一系列对我们来说累赘得很的操作。瞬间感觉清爽好多有木有。

2.对一个集合做一系列处理

现在有个价格的集合。如果价格大于20,先九折,然后相加。如果用java实现

public class Price {public final static List<BigDecimal> prices = Arrays.asList(new BigDecimal("10"), new BigDecimal("30"), new BigDecimal("17"),new BigDecimal("20"), new BigDecimal("15"), new BigDecimal("18"),new BigDecimal("45"), new BigDecimal("12"));public static void sumOfPrices() {BigDecimal total = BigDecimal.ZERO;for(BigDecimal price:prices) {if(price.compareTo(BigDecimal.valueOf(20)) > 0) {total = total.add(price.multiply(BigDecimal.valueOf(0.9)));}}System.out.println("The total is: " + total);}public static void main(String[] args) {sumOfPrices();}
}

这代码也可以正常工作没有问题。问题跟前面一样,还是太累赘,不是那么优雅,可读性也不是很好。用scala写一下上面的逻辑:

object Prices {def main(args: Array[String]): Unit = {val prices = Array(10, 30, 17, 20, 15, 18, 45, 12)val total = prices.filter(x => x>20).map(x => x*0.9).reduce((x,y) => x+y)println("total is: " + total)}
}

简直就是强迫症患者的福音有木有!而且这段代码的可读性不知道高了多少:针对集合,先做filter操作,将大于20的元素选出来,然后做map操作,乘以0.9的系数,最后再将所有的值相加。接近于自然语言的表达方式,一目了然。

函数式编程( Functional)与命令式编程( Imperative)对比相关推荐

  1. 一篇文章看懂函数式编程与命令式编程

    文章目录 1 历史来源 2 编程范式 3 函数式编程的崛起 4 函数式编程 4.1 函数 4.2 纯函数 4.3 变量与表达式 4.5 函数与方法 4.6 状态 4.7 函数式编程的特性 4.7.1 ...

  2. 斐波那契实现阶乘js_功能与命令式编程。 Java 8中的斐波那契,素数和阶乘

    斐波那契实现阶乘js 有多种编程风格/范例,但是两个著名的风格是Imperative和Functional . 命令式编程是最主要的范例,因为几乎所有主流语言(C ++,Java,C#)都在推广它. ...

  3. 功能与命令式编程。 Java 8中的斐波那契,素数和阶乘

    有多种编程风格/范例,但是两种著名的风格是Imperative和Functional . 命令式编程是最主要的范例,因为几乎所有主流语言(C ++,Java,C#)都在推广它. 但是在最近几年中,函数 ...

  4. 函数式编程和响应式编程

    到底什么是函数式,他和命令式编程和面向对象有什么区别.(知乎上已经有很多讨论了,感兴趣的话,我在结尾的地方贴了一些链接.) 总的来说,在函数式中,函数是一等公民,函数能作为变量的值,函数可以是另一个函 ...

  5. 【编程语言】函数式编程 Functional Programming

    函数式编程 1. 引言 "函数式编程"是一种"编程范式"(programming paradigm),也就是如何编写程序的方法论. 它属于"结构化编程 ...

  6. 编程范式之命令式与函数式

    文章出自个人博客https://knightyun.github.io/2019/01/27/programming-paradigm,转载请申明 文章目录 命令式编程(Imperative) 函数式 ...

  7. 函数式编程和面向对象式编程_比较函数式编程,命令式编程和面向对象的编程

    函数式编程和面向对象式编程 As Oracle Corporation has introduced some Functional constructs in Java SE 8, now-a-da ...

  8. 编程语言的主要类型,声明式编程,命令式编程()和函数式编程的区别

    编程语言的主要类型 Common programming paradigms include imperative which allows side effects, functional whic ...

  9. 命令式编程与函数式编程

    命令式编程 命令式编程(英语:Imperative programming),是一种描述电脑所需作出的行为的编程典范.几乎所有电脑的硬件工作都是指令式的:几乎所有电脑的硬件都是设计来运行机器码,使用指 ...

  10. 手把手介绍函数式编程:从命令式重构到函数式

    手把手介绍函数式编程:从命令式重构到函数式 序 本文是一篇手把手的函数式编程极简入门介绍,借助代码示例讲解细腻.但又不乏洞见,第一节中列举和点评了函数式种种让眼花缭乱的特质,给出了"理解函数 ...

最新文章

  1. linux 基础学习入门 2
  2. ORB_SLAM安装问题error: ‘std::chrono::monotonic_clock’ has not been declared
  3. Java学习之容器上(Collection接口常用方法,Iterator接口,使用foreach循环遍历Collection集合元素,Set集合通用知识(Hashset类,hashcode()与Lin
  4. linux 指定库名 登录mysql_Linux下指定mysql数据库数据配置主主同步的实例
  5. 按字寻址与按字节寻址
  6. Eclipse里web的依赖工程部署的简便方法
  7. 【转】使用ArcGIS Engine开发ArcGIS Server的胖客户端浏览程序
  8. 利用互斥体阻断想哭蠕虫,实现联网升级
  9. winrar皮肤的更换
  10. 回顾 | 进击吧! Blazor !第四期 组件开发
  11. redhat修改mysql编码格式_RedHatLinux下修改MySQL编码方式
  12. MySQL带参数的存储过程小例子
  13. 杭电ACM hdu 2079 选课时间 (模板)
  14. 博文视点大讲堂第18期:从草根到巨人——互联网时代的LAMP开源架构
  15. 三菱plc可以用c语言编程吗,三菱PLC六种常用编程语言讲解
  16. 【GIS】GIS矢量空间分析(上)
  17. matlab d函数,matlab常用函数大集合
  18. H3C S5500V2交换机误格式化恢复
  19. linux系统ping地址端口,linux ping 带端口
  20. 基于php+mysql的 医院病房管理系统

热门文章

  1. 研究发现,近一半生产容器存在漏洞
  2. 【译】Vault 学习资源:1.0, 自动解印, 代理, Kubernetes
  3. linux底层内存管理--内核空间的伙伴系统
  4. apache-cxf测试webservice添加header信息
  5. Bean Validation 技术规范特性概述
  6. web 开发安全性问题
  7. ansible安装包和管理 playbook相关
  8. Handler处理机制
  9. Android开发之PullToRefresh的Click点击事件的监听实现长按删除Item
  10. mycelipse中关于编码的配置