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

屏幕截图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

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

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

相关文章

巨蟒django之权限6: 权限控制表设计登录权限

1.权限控制表设计 内容 1. 什么是权限? 2. 为什么要有权限?不同用户拥有不同的功能 3. 在web开发中,什么是权限?url 代表 权限4. 开发一个权限的组件,为什么要开发组件?5. 表结构的设计# 第一版权限表 pe…

CSS制作镂空字体

1.效果图 2.html内容&#xff1a; <!doctype html><html lang"en"><head> <meta charset"UTF-8"> <title>Document</title></head><style> body{background: rgb(248,248,248);} span{font-size: 240px;…

为什么要在Java的Serializable类中使用SerialVersionUID

序列化和SerialVersionUID始终是许多Java开发人员的难题。 我经常会看到类似此SerialVersionUID的问题&#xff0c;或者如果不在我的Serializable类中声明SerialVersionUID会发生什么情况&#xff1f; 除了涉及到的复杂性和罕见的使用之外&#xff0c;这些问题的另一个原因是Ec…

SQL2005-使用openrowset 里读取excel文件

很多时候我们都知道使用.net代码去读取word,excel文档&#xff0c;但是我们如何使用sql句语里读取excel文件呢&#xff1a;SQL2005为我们提供了OPENROWSET来访问各种数据源&#xff1a;,当然我还是建议使用.net代码来读取这些文件。这里就不多说了。 我们先看一下官方的解释&am…

Java中的SynchronousQueue示例–生产者使用者解决方案

SynchronousQueue是BlockingQueue的一种特殊类型&#xff0c;其中每个插入操作必须等待另一个线程进行相应的删除操作&#xff0c;反之亦然。 当您在SynchronousQueue上调用put&#xff08;&#xff09;方法时&#xff0c;它将阻塞&#xff0c;直到有另一个线程将该元素从Queue…

OnSen UI结合AngularJs打造”美团APP我的”页面 --Hybrid App

1、页面效果图&#xff1a; 演示地址&#xff1a;http://www.nxl123.cn/bokeyuan/meiTuanDemo_mine/ 2、核心代码 mine.html&#xff1a; <ons-page id"mine" ng-controller"MineController"> <!--toolbar开始--> <ons-toolbar>…

[MOSS开发]:通过简单BUG跟踪Demo阐述用户控件对列表的操作

下面的文章我想以一个具体的BUG跟踪Demo来说明MOSS的具体应用,这里面会应用到下面的知识点: 1:用户组,用户的创建,权限分配&#xff1b; 2:列表的概念以及创建&#xff1b; 3:利用用户控件来完成表单的增加加功能&#xff1b; 4:当前域用户查看自己BUG。 BUG跟踪软件在一些…

Maven的课堂笔记4

9.Maven与MyEclipse2014结合 MyEclipse10以上的版本,对Maven支持的就比较好 9.2 Myeclipse配置 本地文件夹的C盘的.m2文件夹下必须得有这个settings.xml文件 不配置这个settings.xml文件的话,myeclipse会从互联网上下载需要的jar包. 9.3 修改pom文件 添加jar包 <project xml…

vue动画

vue 提供了一些显示、隐藏一些不同的过渡&#xff0c;效果主要跟 v-if v-show 动态组件 1. vue 给动画分了 6 个过程&#xff0c;在 css 中扮演 6 个类 .v-enter  定义动画的开始状态 .v-enter-active  定义动画生效时的状态 .v-enter-to  定义动画结束是的状态 .v-leave…

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

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

vegas 为盖斯

vegas 为盖斯 S键 分割素材U键 分开视频和音频I键渲染开始O渲染结束 默认布局 为盖斯新建项目的参数 剪好后渲染 插入字幕 转载于:https://www.cnblogs.com/GaoNa/p/10562504.html

COMET彗星(三)构建自己的COMET核心

主题列表&#xff1a; COMET彗星&#xff08;一&#xff09;SERVER PUSH介绍 COMET彗星&#xff08;二&#xff09;基于SERVER PUSH的消息传输 引言&#xff1a; 在上一篇随笔中&#xff0c;对COMET使用的类和作用进行了简短的介绍&#xff0c;从本篇随笔开始&#xff0c;将从实…

如何在JavaServer Pages中使用Salesforce REST API

摘要&#xff1a;本教程提供了一个JSP示例以及如何将其与Salesforce REST API集成。 我们将逐步完成创建外部客户端以使用Force.com &#xff08;同时使用HTTP&#xff08;S&#xff09;和JSON&#xff09;管理您的数据的分步过程。 在此示例中&#xff0c;我将Mac OS X 10.9.…

写在08年“愚人节”

从博客园学了很多东西&#xff0c;是时候该回馈了。谢谢博客园给我们提供这么好的平台交流技术。 刚发了文章习惯性的看了下自己博客的首页代码&#xff0c;感觉日历不够精良。 我做过的一个ajax日历&#xff0c;可以参考解放日报 艺术家具版的日期直达功能的日历&#xff0c;用…

JQuery实现点击按钮切换图片(附源码)--JQuery基础

JQuery实现切换图片相对比较简单&#xff0c;直接贴代码了哈&#xff0c;有注释噢&#xff01;疑问请追加评论哈&#xff0c;不足之处还请大佬们指出&#xff01; 1、案例代码&#xff1a; demo.html&#xff1a; <!DOCTYPE html><html><head>   <me…

CSS3盒子模型

web前端必须了解的CSS3盒子模型 1、需要了解的属性以及属性值 display:box或者display:inline-box box-orient:horizontal | vertical (水平 垂直) 定义盒模型的布局方向 box-direction:normal reverse(正序 反序) 元素排列顺序 box-ordinal-group:number(数值) 设置元素…

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

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

html5表单与PHP交互

1、示例代码 前端&#xff1a; <!DOCTYPE html><html><head><meta charset"utf-8"> <title>html5表单与PHP交互</title></head><body><form action"http://localhost/jh.php" method"post"…

【DP】【期望】$P1850$换教室

【DP】【期望】\(P1850\)换教室 链接 题目描述 有 \(2n\) 节课程安排在$ n$ 个时间段上。在第 \(i\)&#xff08;\(1 \leq i \leq n\)&#xff09;个时间段上&#xff0c;两节内容相同的课程同时在不同的地点进行&#xff0c;其中&#xff0c;牛牛预先被安排在教室 \(c_i\)上课…

高并发服务器逻辑处理瓶颈,如何解决?

https://mp.weixin.qq.com/s/GHHHvgURdZpNJ1Ec6RHgPg 高并发衡量指标 响应时间&#xff1a;系统对请求做出响应的时间&#xff0c;即一个http请求返回所用的时间&#xff1b;吞吐量&#xff1a;单位时间内处理的请求数量&#xff1b;QPS&#xff08;TPS&#xff09;&#xff1a…