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

java8 函数式编程

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

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

那么,为什么会有这种方向变化? 您可能会提出几个原因,但我们首先要假设行业最佳实践会随着时间的推移而变化,甚至最流行的语言也有一天会不受欢迎。 我想如果您还年轻,就会有一天回头说“记得我们曾经使用Java的时候”吗? 在探讨为什么会有这种变化之前,让我们回顾一下1980年代到这里的方式……

屏幕截图2014年5月21日在17.12.42 根据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年所做的一个项目购买一个,价格为数千英镑,而您却无法以爱情或金钱买到一个,每个人都想要一个。 但是,我离题了。

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


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

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

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

屏幕截图2014年5月22日在11月29日 最后,在我的编程简要历史中,最后是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

java8 函数式编程

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/341444.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Dell笔记本双系统安装(Ubuntu 16.04)

一 参考博客 重点 以上博客在分盘问题中描写不详细,参考右边博客: 有关分盘问题 注意:其中,由于Bios Dell与其余电脑存在区别, 1. 开机按F12,进入BIOS 2.在 BIOS 的Boot菜单下,将Secure Bo…

pat 乙级 1006 换个格式输出整数(C++)

题目 让我们用字母 B 来表示“百”、字母 S 表示“十”&#xff0c;用 12…n 来表示不为零的个位数字 n&#xff08;<10&#xff09;&#xff0c;换个格式来输出任一个不超过 3位的正整数。 例如 234 应该被输出为 BBSSS1234&#xff0c;因为它有 2 个“百”、3 个“十”、以…

Selenium Java教程– Selenium中的类名定位器

Selenium中CSS Locator是编写脚本的最重要方面之一。 如果您无法通过使用Selenium中的任何CSS定位器来定位元素&#xff0c;那么精通Selenium自动化将是一项艰巨的任务。 硒提供多种定位元素的方法。 您可以查看有关Selenium中不同CSS定位器的其他文章&#xff0c;这些文章可通…

C++ floor、ceil、round函数的区别

函数解释 floor函数&#xff0c;向下取整。即向负无穷方向取离传入参数最近的整数ceil函数&#xff0c;向上取整。即向正无穷方向取离传入参数最近的整数round函数&#xff0c;四舍五入。 头文件 C语言&#xff1a;math.hC: cmath 函数原型 double floor(double)double ce…

C++ 函数参数3种传值方式(以交换两个数为例)

简介 在C中&#xff0c;函数参数的传值方式有传值调用、指针调用和引用调用。接下来&#xff0c;通过一个实例来演示三者区别。 代码 #include <iostream>using namespace std; //传值调用 void Swap(int a,int b) {int tempa;ab;btemp; } //指针调用 void Swap2(int…

Ubuntu系统中利用Sublime分别运行Python与Python3

背景 两台Ubuntu系统的电脑均使用Sublime&#xff0c;运行相同的代码&#xff0c;出现不同的效果。 经观察&#xff0c;一个Sublime python F5 编译采用的为python3&#xff0c;另一个采用的为python2&#xff08;通过两个版本的print函数不同观察&#xff0c;一个print&…

AWS Lambda事件源映射:使您的触发器混乱无序

最近&#xff0c;我们为Sigma Cloud IDE上的无服务器项目引入了两个新的AWS Lambda事件源&#xff08;触发类型&#xff09;&#xff1a; SQS队列和DynamoDB流 。 &#xff08;是的&#xff0c;AWS在几个月前就向他们介绍了&#xff1b;但是我们仍然是一个很小的团队&#xff0…

java 并发计数器_Java 8 LongAdders:管理并发计数器的正确方法

java 并发计数器我只是买了新玩具&#xff0c;而Java 8有很多 。 这次我想谈谈我的最爱之一-并发加法器。 这是一组新的类&#xff0c;用于管理由多个线程编写和读取的计数器。 新的API有望显着提高性能&#xff0c;同时仍使事情简单明了。 自从多核体系结构问世以来人们一直在…

数独 -- 合法数独与完全数独

一、数独的介绍 从2004年底开始&#xff0c;数独游戏在英国变得非常流行。数独(Sudoku)是一个日语单词意思是数字位置之类的单词(或短语)。谜题的理念非常简单;面对一个9 9的网格&#xff0c;被分成9个3 3的块: 在其中的一些盒子里&#xff0c;设置者放一些数字1-9:求解者的目…

程序包无效:“CRX_HEADER_INVALID“

版权声明&#xff1a;本文为博主转载文章&#xff0c;遵循 CC 4.0 BY-SA 版权协议&#xff0c;转载请附上原文出处链接和本声明。 转载本文链接&#xff1a;https://blog.csdn.net/qq_41973208/article/details/89431020 之前在安装谷歌插件的时候遇到的问题&#xff0c;解决…

pat 乙级 1027 打印沙漏(C++)

题目 本题要求你写个程序把给定的符号打印成沙漏的形状。例如给定17个“*”&#xff0c;要求按下列格式打印 所谓“沙漏形状”&#xff0c;是指每行输出奇数个符号&#xff1b;各行符号中心对齐&#xff1b;相邻两行符号数差2&#xff1b;符号数先从大到小顺序递减到1&#x…

chrome 占用大量内存直到网页崩溃_Chrome吃内存太夸张!几招解决Chrome占内存硬伤...

我们知道Chrome是非常出色的浏览器&#xff0c;无论从性能还是功能的角度来看&#xff0c;都是如此。但是Chrome在内存占用方面的表现&#xff0c;就很令人头疼了&#xff01;常常听到有朋友抱怨&#xff0c;想要上网找找素材&#xff0c;不一会儿发现Chrome已经将PS要用的内存…

windows和ubuntu双系统设置开机默认系统

1、记住grub界面中windows的位置 我的界面如下&#xff1a;windows在第3行 2、选择进入ubuntu系统 3、打开终端&#xff0c;输入如下命令 sudo vim /etc/default/grub 4、看到如下图的内容 GRUB_DEFAULT是开机启动的默认项&#xff08;我的windows是第3行&#xff0c;所以此…

jenkins jboss_与JBoss Fuse,Jenkins和Nexus的持续集成

jenkins jboss最近&#xff0c;我正在整理一个快速启动的Maven项目&#xff0c;以展示组织JBoss Fuse项目的可能方法。 该项目可以在Github上找到&#xff1a; https : //github.com/paoloantinori/fuse_ci 这是我与朋友詹姆斯罗林斯 &#xff08; James Rawlings&#xff09…

完全禁用Microsoft Compatibility Telemetry

完全禁用Microsoft Compatibility Telemetry Win S 中搜索 任务计划程序 /Microsoft/Windows/Application Experience 禁用 Microsoft Compatibility Appraiser 如果不管用 服务里禁用 Diagnostic Policy Service

第19次csp认证 202006-2 稀疏向量(C++)

题目 分析 本题需要计算的是两个n维向量的内积&#xff0c;只需计算两者对应的稀疏向量index相同的分量乘积&#xff0c;然后累加就可以了。 向量的一个分量包含index和value&#xff0c;使用struct来存储比较方便。n<109&#xff0c;a,b<5 * 105&#xff0c;|ui| * |v…

解决Windows 10 CPU占用高风扇吵问题

很多笔记本用户在升级到Windows 10后&#xff0c;都遇到了这样一个问题&#xff0c;那就是Windows 10的CPU占用明显高于Windows 7。这个问题对于台式机可能还算不了什么&#xff0c;顶多就是偶尔卡一下罢了。可由于笔记本大多采用变速风扇&#xff0c;CPU温度飙高时&#xff0c…

知识图谱 图数据库 推理_图数据库的知识表示与推理

知识图谱 图数据库 推理图形数据库及其技术生态系统可以为知识表示和推理问题提供优雅&#xff0c;有效的解决方案。 要了解这种说法&#xff0c;我们必须首先了解什么是图形。 图是一种数据结构。 图数据结构的类型很多&#xff0c;但出于本文的目的&#xff0c;我们将重点介绍…

java状态模式和策略模式_Java状态和策略设计模式之间的差异

java状态模式和策略模式为了在Core Java应用程序中正确使用状态和策略设计模式&#xff0c;对于Java开发人员清楚地了解它们之间的区别很重要。 尽管状态和策略设计模式的结构相似&#xff0c;并且都基于开放式封闭设计原则&#xff0c;从SOLID设计原则表示为“ O”&#xff0c…

正斜杠/和反斜杠\的区别

近来研究源码时发现&#xff0c;常常在路径中出现正斜杠“/”和反斜杠“\”&#xff0c;之前就一直不胜其扰&#xff0c;所幸查资料把它一次弄懂&#xff0c;求个明白。在这里做个记录。 我认真搜了一下&#xff0c;发现问这个问题的人还不少&#xff0c;知乎上也有提问的。来…