本文已授权"后端技术精选"独家发布。

开发者使用Java8编写复杂的集合处理算法,只需要简单的代码就能在多喝cpu上高效运行,这就是Lambda表达式的初衷。

提示:函数式编程和语言无关,它是一种思想,任何语言都可以实现函数式编程,区别只是实现的难易程度不同而已。

在java中,lambda本身就是函数式编程的运用,那什么是函数式编程呢?

1. 函数式编程是什么

靠术语解释是很难理解的,所以,可以通过它的一些特点和优点来感受什么是函数式编程。重点有做标记。

1.1 特点

1. 函数是"第一等公民"

所谓"第一等公民"(first class),指的是函数与其他数据类型一样,处于平等地位,可以赋值给其他变量,也可以作为参数,传入另一个函数,或者作为别的函数的返回值。

举例来说,下面代码中的print变量就是一个函数,可以作为另一个函数的参数。

var print = function(i){ console.log(i);};

[1,2,3].forEach(print);

复制代码

2. 只用"表达式",不用"语句"

"表达式"(expression)是一个单纯的运算过程,总是有返回值;"语句"(statement)是执行某种操作,没有返回值。函数式编程要求,只使用表达式,不使用语句。也就是说,每一步都是单纯的运算,而且都有返回值。

原因是函数式编程的开发动机,一开始就是为了处理运算(computation),不考虑系统的读写(I/O)。"语句"属于对系统的读写操作,所以就被排斥在外。

当然,实际应用中,不做I/O是不可能的。因此,编程过程中,函数式编程只要求把I/O限制到最小,不要有不必要的读写行为,保持计算过程的单纯性。

3. 没有"副作用"

所谓"副作用"(side effect),指的是函数内部与外部互动(最典型的情况,就是修改全局变量的值),产生运算以外的其他结果。

函数式编程强调没有"副作用",意味着函数要保持独立,所有功能就是返回一个新的值,没有其他行为,尤其是不得修改外部变量的值.

4 . 不修改状态

上一点已经提到,函数式编程只是返回新的值,不修改系统变量。因此,不修改变量,也是它的一个重要特点。

在其他类型的语言中,变量往往用来保存"状态"(state)。不修改变量,意味着状态不能保存在变量中。函数式编程使用参数保存状态,最好的例子就是递归。

5. 引用透明

引用透明(Referential transparency),指的是函数的运行不依赖于外部变量或"状态",只依赖于输入的参数,任何时候只要参数相同,引用函数所得到的返回值总是相同的。

有了前面的第三点和第四点,这点是很显然的。其他类型的语言,函数的返回值往往与系统状态有关,不同的状态之下,返回值是不一样的。这就叫"引用不透明",很不利于观察和理解程序的行为。

1.2 优点

1. 代码简洁,开发快速

2. 接近自然语言,易于理解

(1+2)*3-4用函数式语言表达

add(1,2).multiply(3).subtract(4)

复制代码

3. 更方便的代码管理

不依赖、也不会改变外界的状态,只要给定输入参数,返回的结果必定相同。因此,每一个函数都可以被看做独立单元,很有利于进行单元测试(unit testing)和除错(debugging),以及模块化组合。

4. 易于"并发编程"

函数式编程不需要考虑"死锁"(deadlock),因为它不修改变量,所以根本不存在"锁"线程的问题。不必担心一个线程的数据,被另一个线程修改,所以可以很放心地把工作分摊到多个线程,部署"并发编程"(concurrency)。

2. 函数式编程实例

函数式编程关心数据的映射,命令式编程关心解决问题的步骤。

函数式风格没有赋值,也就没有for循环, 要实现循环操作 只能通过递归调用。

public class First {

public static void main(String[] args) {

int a = 10,b = 20;

int c = a+b;

System.out.println(c);

}

}

复制代码

这段代码是用命令来表示程序,用命令的执行顺序来表示程序的组合,所以不是函数式编程。差不多是面向过程的思想。

public class First {

public static void main(String[] args) {

int a = 10,b = 20;

add(a,b);

}

static int add(int a,int b){

int c = a+b;

return c;

}

}

复制代码

这段代码用函数来表示程序,但是内部是用命令的组合来实现,不算真正意义上的函数式编程。面向对象的思想。

public class First {

public static void main(String[] args) {

int a = 10,b = 20;

add(a,b);

}

static int add(int a,int b){

return a+b;

}

}

复制代码

这段代码用函数来表示程序,用函数的组合来表达程序的组合,是完全的函数式编程。

面向对象、面向过程和函数式编程区别

“面向过程”和“面向对象”的区别是“封装”。“函数式”和“面向对象”的区别是“不使用外部状态”。上面的三段代码中也有体现。

如有异议,请在下方评论,谢谢。

java什么是函数式编程,Java 函数式编程(一)初识篇相关推荐

  1. java 函数式编程_函数式编程杂谈

    比起命令式编程,函数式编程更加强调程序执行的结果而非执行的过程,倡导利用若干简单的执行单元让计算结果不断演进,逐层推导出复杂的运算.本文通过函数式编程的一些趣味用法来阐述学习函数式编程的奇妙之处. 一 ...

  2. java 函数式编程_Java函数式编程:Javaslang入门

    java 函数式编程 Java是一门古老的语言,并且该领域中有很多新手在他们自己的领域(JVM)上挑战Java. 但是Java 8到来并带来了一些有趣的功能. 这些有趣的功能使编写新的惊人框架(例如S ...

  3. Java函数式编程和面向对象编程

    文章目录 什么是函数式编程? 什么是面向对象编程? 函数式编程和面向对象编程的优缺点 什么是函数式编程? 函数式编程的核心:在思考问题时,使用不可变对象和函数,函数将一个值经过处理,映射成另一个值. ...

  4. 为什么我不建议你用阿里巴巴Java规范,而使用 Google Guava 编程?

    点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 来自 | 张丰哲 链接 | www.jianshu.com ...

  5. 函数式编程语言python-Python函数式编程

    在 Python 中使用函数式编程的最佳实践! 简 介 Python 是一种功能丰富的高级编程语言.它有通用的标准库,支持多种编程语言范式,还有许多内部的透明度.如果你愿意,还可以查看 Python ...

  6. pthon_函数式编程与面向对象编程的比较

    函数式编程作为结构化编程的一种,正在受到越来越多的重视.工程中不在只是面向对象编程,更多的人尝试着开始使用函数式编程来解决软件工程中遇到的问题. 什么是函数式编程?在维基百科中给出了详细的定义,函数式 ...

  7. JavaScript 的函数式编程与面向对象编程区别在哪?

    本文通过代码来看一看JavaScript中函数式编程和面向对象编程的差异. 作者 | Jesse Warden 译者 | 弯月,责编 | 郭芮 出品 | CSDN(ID:CSDNnews) 以下为译文 ...

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

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

  9. 编程小TIPS:使用函数式风格Either来编程

    最近在一些国外的技术博客中见到一个以前自己没太见过的编程风格,那就是Either,觉得非常有意思,稍微了解了下.分享给大家. 同时,我会基于最流行的后端语言Java来简单的演示下如何使用Either. ...

最新文章

  1. Commons-logging + Log4j 入门指南
  2. java instanceof 继承_继承_instanceOf的使用
  3. svn提交报e200007错误
  4. linux5种IO模型以及同步异步,阻塞非阻塞
  5. 推荐算法实现java_利用Java写开源库 覆盖70多种推荐算法
  6. MyBatis自学(1):MyBatis概述
  7. C# winform 模拟选中并点击某一行DataGridView数据
  8. 【OFDM通信】基于matlab OFDM通信系统仿真【含Matlab源码 315期】
  9. Linux课程设计报告【全集】
  10. 永城2021高考成绩查询,永城中考成绩查询2021
  11. [数据可视化] 折线图(Line Chart)
  12. 关于XShell下载安装和连接Ubuntu(linux)
  13. Tomcat服务器配置https双向认证,使用JDK的keytool生成证书(适用于web、安卓、IOS)
  14. VS2012安装DirectX SDK(DXSDK_Feb10)
  15. P4 开发实践 — 编程基础
  16. 时光荏苒,白驹过隙。2018年总结!
  17. 冰河,能不能讲讲如何实现MySQL数据存储的无限扩容?
  18. 为何,以及如何提炼一个函数
  19. K序列--埃森哲杯第十六届上海大学程序设计联赛春季赛暨上海高校金马五校赛
  20. 电脑从新分盘(软件)

热门文章

  1. 每日一皮:我一般不担心警告,只担心错误...
  2. 深入解读阿里云Redis开发规范:不要只会setget
  3. 虎牙直播在微服务改造方面的实践和总结
  4. mysql中有哪些数值型函数_mysql数值型函数汇总
  5. Springboot集成websocket实例
  6. 车辆颜色识别学习笔记
  7. opencv检测矩形
  8. torch.set_num_threads
  9. Python PIP Install throws TypeError: unsupported operand type(s) for -=: 'Retry' and 'int'
  10. python 优化加速方案