我最近一直在研究Java 8,并掌握了Manning出版的“ Java 8 In Action” 。 让我印象深刻的第一件事是Java 8的独特销售主张是函数式编程。 函数现在是一流的变量,您可以像intString一样在代码中传递它们。 这是一个很大的变化。

近年来,功能语言似乎变得越来越流行,并且它们没有尽头可供选择。 现代函数式编程语言的例子包括Clojure,JavaScript,Scala,甚至是1980年代后期发明的Erlang都重新流行了。

那么,为什么会有这种方向变化? 您可能会提出几个原因,但我们首先要假设行业最佳实践会随着时间的推移而变化,甚至最流行的语言也有一天会不受欢迎。 我想如果您还年轻的话,会有一天您会回头说“记得我们以前使用Java的时候”吗? 在探讨为什么会有这种变化之前,让我们回顾一下1980年代到这里的方式……
根据Wikipedia的说法,IBM PC于1981年8月12日发布。第一批PC配备了BASIC 1,尽管帅哥很快对此感到厌倦,并转而使用Borland的Turbo Pascal。 Turbo Pascal的冷静并没有持续太久,因为微软收购了Microsoft C(或MSC),后者很快成为事实上的标准。 这很酷,因为如果您很聪明,则可以使用int 21Hint 10Hint 14h以及其他int 10H直接访问硬件,并且如果可以记住哪个中断做了什么,那么您就和我一样老2

IBM PC之前还有其他计算机,包括Apple II,Commodore Pet等,但是IBM PC是用于商业应用程序的“成熟” PC。 我记得我曾尝试为我在1985年所做的一个项目购买一个,它们要花上千英镑,而你却不能为了爱情或金钱而得到一个,每个人都想要一个。 但是,我离题了。


在1980年代后期,出现了Microsoft Windows SDK,这是一个基于C的SDK,自从平铺Windows 1以来就出现了(显然,Microsoft在Windows 1中没有使用重叠的窗口,因为它复制了Apple的Macintosh并可能侵犯了他们的专利-尽管据称Apple窃取了Xerox Parc为Mac设计的想法,尽管我不确定这是多么真实)。 该SDK确实在Windows 2中盛行,为回调,基于消息的编程引入了世界。 他们据称是从Unix上的X-Windows和Motif偷走的。

在1990年代中期左右语言成为面向对象的 ; 发明了类来将方法和数据联系在一起,引入了数据隐藏和封装的概念。 “ C”变为“ C ++”,如果此时您使用的是Windows SDK,则切换到Microsoft基础类; SDK的OO包装器。 这种变化被视为一件好事。 旧的基于函数的语言的一个主要问题是,您可以在代码库中的任何位置分配全局变量,然后随时使用任何函数对其进行更改。 显然,这在很多系统中造成了重大问题,因为您不确定更改全局变量的状态不会在应用程序的某个遥远角落引入错误。 事实语言C的另一个主要问题是负责分配和释放内存,并且如果内存指针是全局的,那么在访问它们时,您不能100%地确定该指针仍然有效,如果不是, t ...你坠毁了。

伴随着面向对象的语言出现了面向对象的方法论,并在1990年代后期使用UML达到了顶点。 这是Booch方法 , James Rumbaugh的 OMT和Ivor Jacobsen的 OOSE的融合,并且在设计软件时是必不可少的。 各种各样的工具都可以用来记录和传达您的设计,并且从经验来看,其中一些工具的质量非常可疑,这就引出了一个问题:开发人员是否真的在使用UML编写他们的UML程序? 如果是这样,那么这些产品对于UML来说并不是一个好广告。

如今,您没有看到使用UML的组织那么多,尽管当我需要直截了当设计时,我仍然会这样做。 我的UML工具的首选是,并且永远是铅笔和纸 。 这很简单,而且可以正常工作。

最后,在我的编程简要历史中,最后是Java。 Java最初于1995年发布,几年后开始流行,它基于改进C ++的思想。 这主要是因为它在自己的虚拟机上运行,​​该虚拟机为您处理内存分配和释放。 它已成为面向对象语言的事实上的标准。

关于这个大致组成的时间表的事情是命令式编程的基本概念。 总而言之,汇编语言产生了C,C导致了C ++和OO,而C ++和OO导致了Java –所有这些都是必须的。 Wikipedia很好地概述了命令式编程,因此我不会对其进行详细介绍,但我将命令式编程概括为具有函数和可变状态的编程,这意味着您可以拥有实例变量和全局变量。

函数式编程与命令式编程有何不同? 主要思想是函数是数据,就像整数和字符串一样。 算法是根据函数调用实现的( while不存在for循环,而使用递归),并且变量始终是局部的。

您可能会误以为,因为它们包含函数的概念并且没有类,所以C和Turbo Pascal之类的语言都是函数式编程语言。 它们不是,它们是命令式编程语言,因为它们具有状态数据。

那么,有什么变化? 常见的答案是硬件发生了变化,这是由Erlang开发人员提出的,而在Manning的Java 8书中可以找到。 现在,至少在服务器机房中可以找到的“计算机”是一种复杂的多处理器,多核事务,其存储容量为TB。 以HP Proliant DL580 G8服务器为例; 它最多具有四个处理器,每个处理器最多可以具有15个64位内核。 这是巨大的,特别是与原始IBM PC上的原始,革命性的16位Intel 8086相比。 假设您正在运行Unix,并且运行了top命令,那么最大处理器使用率将为6000%。 鉴于机器功能的急剧增长,我们的软件开发人员需要能够支持它们的语言,从而使我们能够轻松地使用所有这些并发处理能力,而这正是功能编程的出现。

在命令式编程中,您可以具有实例变量,全局变量和可变状态。 可以在线程之间共享这些资源,尽管共享这些资源在同步和锁定方面既昂贵又效率低下。 这也是相当缓慢且困难的事情,因为您必须避免死锁和其他类似问题。 函数式编程消除了所有这些问题,因为它消除了实例变量和状态的所有繁琐处理。 这意味着您不必费心进行锁定和同步,线程或进程(随便称呼它们)可以彼此独立。

那是理论,但是它可以接受审查吗? 别忘了,有可能编写出良好的多线程程序,这些程序可以有效地使用具有命令性Java 6或7的大型多核和多处理器计算机的许多内核。就像函数式编程语言一样,您必须考虑一下自己所要做的事情。为此,请设计合适的设计并使用业务“最佳实践”执行它。 仅仅因为Java 6或7是命令性语言,您不必在线程/进程之间共享数据并使用同步和锁定,这仅是设计问题。 逻辑上的结论是,您可以不使用函数式编程而做,这可能导致函数式编程语言流行的真正原因:人们喜欢使用它们。

因此,您可以说功能语言是“最新的东西”。 狂热,他们是新潮,一种时尚。 我必须强调,软件开发中的“时尚”不一定是一件坏事,也不是什么新鲜事。 如果您回到上面的历史,您会发现时间轴上充满了趋势和疯狂:在Turbo Pascal和BASIC上采用了“ C”,范式转移到了Object Orientation,甚至是通过Java转移到Java它只需编译一次即可在任何地方运行。

您必须学习Java 8的函数式编程吗? 几年后问我...

1由于我记忆犹新,因此确保此博客中的所有历史事实都不准确。
2如果我错了,请纠正我,但是int 21H = MSDOS函数, int 10H =直接屏幕访问,并且int 14H =串行I / O

翻译自: https://www.javacodegeeks.com/2014/05/is-it-imperative-that-you-learn-functional-programming-with-java-8.html

您必须学习Java 8的函数式编程吗?相关推荐

  1. java8 函数式编程_您必须学习Java 8的函数式编程吗?

    java8 函数式编程 我最近一直在研究Java 8,并掌握了Manning出版的" Java 8 In Action" . 让我印象深刻的第一件事是Java 8独特的销售主张是函 ...

  2. Java 1.8 函数式编程详解

    Java 1.8 函数式编程详解 文章目录 Java 1.8 函数式编程详解 一. 概述 1.1 java 8 新特性: 二. 函数式接口 2.1 函数式接口概述 2.2 Lambda表达式概述 2. ...

  3. 用通俗易懂的大白话搞明白Java里的函数式编程和Lambda表达式

    今天,用通俗易懂的大白话来彻底搞明白Java里的函数式编程和Lambda表达式 为什么引入函数式编程,lambda表达式? 大家都知道,JDK1.8引入了函数式编程,lambda表达式. 那有没有想过 ...

  4. 【Java】23 函数式编程

    函数式接口(Functional Interface)是 JDK 1.8 对一类特殊类型的接口的称呼. 这类接口有且仅有一个抽象方法,并且这类接口使用了 @FunctionalInterface 进行 ...

  5. Java 中的函数式编程

    1. 概述 在本教程中,我们将了解函数式编程范式的核心原则以及如何在 Java 编程语言中使用它们. 我们还将介绍一些高级函数式编程技术.这将帮助我们了解 Java 中的函数式编程的好处. 2. 什么 ...

  6. JAVA学习 API_day11(属性集, 函数式编程, stream流)

    属性集, 函数式编程, stream流 I/O流小结 1. 属性集 2. 函数式编程 3. stream流 I/O流小结 文件复制: BufferedInputStream/BufferedOutpu ...

  7. 这个类库可以帮助你理解Java中的函数式编程

    每当JDK发布了新版本就有同学说"你发任你发,我用Java 8",可在工作中有不少人依然不太擅长使用Java8的新特性,而这些特性往往让Java不再"臃肿".不 ...

  8. Java如何支持函数式编程?

    简介:Java是面向对象的语言,无法直接调用一个函数.Java 8开始,引入了函数式编程接口与Lambda表达式,便于开发者写出更少更优雅的代码.什么是函数式编程?函数式编程的特点是什么?本文通过代码 ...

  9. 面向java开发者的函数式编程_函数式编程让你忘记设计模式

    本文是一篇<Java 8实战>的阅读笔记,阅读大约需要5分钟. 有点标题党,但是这确实是我最近使用Lambda表达式的感受.设计模式是过去的一些好的经验和套路的总结,但是好的语言特性可以让 ...

最新文章

  1. WHY YOUR PRIVATE CLOUD COULD LOOK A LOT LIKE PAAS
  2. P2571 [SCOI2010]传送带
  3. 用最简单的例子说明设计模式(三)之责任链、建造者、适配器、代理模式、享元模式...
  4. iOS-关于cell的重叠问题
  5. Java new关键字和newInstance()方法的区别
  6. tensorflows十五 再探Momentum和Nesterov's accelerated gradient descent 利用自动控制PID概念引入误差微分控制超参数改进NAGD,速度快波动小
  7. powershell.exe直接运行命令
  8. java 难度_java中难度大一点的面试题
  9. python:批量移动指定文件到指定文件夹(模板)
  10. IDA 7.0在Mojava更新后打不开的问题
  11. 云输入法linux版,ubuntu云输入法ibus cloud pinyin
  12. Hbase数据库安装
  13. 【深度学习】图像超分实验:SRCNN/FSRCNN
  14. 传智黑马java基础学习——day10(继承、抽象类)
  15. Kali 无法连接到网络
  16. 计算机win文件题型,《计算机应用基础》操作系统应用题型专项练习
  17. POJ3322解题报告
  18. lcb2板服务器状态说明,西子奥的斯服务器LCB2RCB2服务器使用[技术专攻]
  19. Linux常用服务部署与优化
  20. 技术 KOL 龙神:永远挑战难度值增加 30% 的事情

热门文章

  1. JS删除之前弹出一个带有确认和取消按钮的提示框confirm()
  2. excel批量插入 配置yml
  3. 最新开发android版本,Android版本检测升级
  4. 设计费收费标准2002修订_@设计师,2019景观园林设计收费标准,注意查收!
  5. java如何查看调用记录_查看Java记录
  6. jdk 11 模块系统_JDK 9:模块系统状态的重点
  7. Java XMPP负载测试工具
  8. gradle入门_Gradle入门:简介
  9. java lambda循环_在Java 8 Lambda中创建自己的循环结构
  10. 如何在Java中使用Zxing和JFreeSVG创建QR Code SVG?