Java 8 Lambdas –缺少脱离Java的链接

我学习了函数式编程,但是后来我决定我更喜欢命令式编程,于是我转回去。

—没人

从命令式编程过渡到函数式编程是当今非常普遍的事情。 互联网上的博客文章充斥着关于它的证词。 我读过的所有内容以及与我交谈过的每个人(包括我自己)都有相同的故事。 一旦他们开始函数式编程,就不会再回头了。 他们喜欢它,在早期,即使他们学到的很少,他们也渴望
学到更多。

在我看来,从命令式编程到函数式编程是交通繁忙的必经之路。 这是一个二极管,两端有一百万伏特的电压。 这是自来水管道上的止回阀。 您不仅不能回头,而且还带有无法抗拒的探索和学习更多知识的欲望,这使您进一步进入函数式编程。

Java 8 Lambdas

随着Java 8 lambda的到来,这为地球上最大的一组开发人员之一带来了一个有趣的转折点。 Lambda本身不一定等同于函数式编程。 但是他们确实启用了它。 随着这里的开发人员开始涉足函数式编程(那里是库维护者),我们将开始看到Java源代码中的一些新事物。 以前可能返回null将开始返回Optional 。 执行IO的库(例如HTTP客户端库)将开始返回CompletableFuture 。 越来越多的功能概念将开始渗透到Java接口中,将有称为fold,map,reduce,collect的方法。 因此,这将开始Java大众从命令式编程过渡到函数式编程的单一方式。

但是Java是否可以满足他们的需求? 看着Lambda规格,我怀疑不是。 我在Lambda规范中看到了一个天才的精髓,它使Lambdas可以立即使用许多现有的库,而无需进行任何更改。 这是因为Lambda只是用于实现单抽象方法(SAM)接口的语法糖。 在Java中,随处可见SAM,从并Callable中的RunnableCallable到Swing中的ActionListener ,再到Guava中的FunctionSupplier ,列表将不胜枚举。 所有这些库今天都已准备就绪。

但是,这也带来了问题。 开始编写事物时,函数式编程会变得很有趣。 传递函数并将它们组合在一起的能力提供了强大的功能-但是Java 8 Lambda并不是可组合的。 Java 8确实提供了Future SAM,但是Guava和许多其他库也提供了。 要将它们组合在一起,您需要组合方法的所有排列。 至少,不是以传统的Java方式,两个相同类型的SAM甚至都不是很容易组成,因为您不能向SAM添加任何方法(例如map或transform方法)来进行合成。

因此,如果没有能力执行最基本的功能概念之一(组成功能),Java能否成为一种功能语言? 也许有一些我没有想到的创造性方法可以解决这个问题。 也许并不需要,我认为Java 8 Lambda的设计者无意将Java变成一种功能语言,因此您不能将其称为Lambda规范的错误。 但是问题是,正如我早先指出的那样,对函数式编程有所了解的开发人员将想要更多,并且想要更快。 即使Java可以成为一种功能语言,我也认为它不会跟上Java开发人员向功能编程的发展。

所以我要做个预测。 Java 8 Lambdas将被急切采用。 如此急切地将Java本身抛在后面,并且大多数Java开发人员将转向一种能够满足他们需求的语言,因为他们迫切需要新的函数式程序员。

哪种语言?

在推测Java开发人员将使用哪种语言之前,首先让我确定一下我既有偏见又无知。 我为Typesafe工作,因此显然偏向于Scala。 除了在大学与Haskell和ML一起玩之外,我从没有在生气时使用任何其他功能性语言。 因此,我一言不发,如果您不同意,请撰写自己的博客文章。

Scala作为一种过渡语言

因此,首先,我认为Scala为命令式程序员切换到函数式编程提供了一种很棒的过渡语言。 对Java 8 Lambdas的函数式编程有所了解之后,Java开发人员会发现自己在Scala中非常满意。 他们仍然可以按照以前的方式进行所有操作,拥有vars和mutable集合,并且掌握了所有标准的Java库。 当然,他们可以开始加深对函数式编程的了解。 因此,Scala提供了从命令式编程到函数式编程的平稳过渡,您可以根据需要快速或缓慢地采用函数式编程。

Scala作为目标语言

过渡到函数式编程后,开发人员会留在Scala,还是会像从Java迁移一样继续寻找更纯净的语言? 我的意见是不。 从广义上讲,我看到了函数式编程社区中的两个阵营。 第一个阵营将功能编程视为必须遵循的一组法律。 对于这个营地,Scala有很多不必要和/或危险的事情,他们可能不会将Scala视为最终目的地。

第二个阵营将函数式编程视为应被广泛利用的强大工具,而不是必须遵循的一组法律。 我站在这里,Scala很好地满足了该营地的需求。 函数式编程在Scala中提供了一流的支持,但您总是可以在需要时退回到当务之急。 我怀疑大多数Java社区都倾向于加入这一阵营,否则,他们将已经回避Java并编写Haskell。 因此,我认为Java 8 Lambda对于Scala将会非常有用,因为它们使Java开发人员可以了解Scala将为他们做些什么,从而将大量精力集中到Scala开发中。

参考: Java 8 Lambdas – James and Beth Roper的博客博客中缺少我们的JCG合作伙伴 James Roper 离开Java 的链接 。

翻译自: https://www.javacodegeeks.com/2013/04/java-8-lambdas-the-missing-link-to-moving-away-from-java.html

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

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

相关文章

倒计时 时间校准android,android倒计时器时间

我一直在使用android倒计时器样本来创建某个日期的倒计时.Time TimerSet new Time();TimerSet.set(20, 8, 2012); //day month yearTimerSet.normalize(true);long millis TimerSet.toMillis(true);Time TimeNow new Time();TimeNow.setToNow(); // set the date to Current…

(转)zabbix3.4使用percona-monitoring-plugins监控mysql

原文:https://blog.csdn.net/yanggd1987/article/details/79656771 简介 之前主要使用nagios监控mysql,本文主要介绍使用percona-monitoring-plugins监控mysql,percona监控插件是php开发,因此要在agent安装php环境。 配置安装 一.…

用订阅/发布者模式解决异步函数结果依赖的问题

我们都知道node是基于事件无阻塞i/o模型的,所以说大部分函数都是以异步实现的,请看下面代码: db.query(sql1, function (err, data) {//code })db.query(sql2, function (err, data) {//code })如果我们上述两个操作,结果之间没有…

在集成测试中模拟耗时的动作

最近在我的一个项目中,我遇到一种情况,需要为该应用程序创建集成测试。 这不是很奇怪,不是吗? 有趣的是,该应用程序的逻辑涉及一些并发问题,并且其中一个组件必须连接到外部服务,这将花费几秒钟…

html基础-html简介-第一个网页(1)

今天刚刚开通博客园,把我最近整理的html/css来说一下,对于初学者还是有一定的帮助。 一、先来为大家简单普及以下html (1)、html英文即:hypertext markup language 中译 : 超文本标记语言 (2&…

javafx android sdk,JavaFX打包到Android上

让JavaFX运行到移动平台一直是社区努力完成的事。当然,目前已经可以让JavaFX运行到Android和IOS平台了,下面我们来看看如何打包自己的JavaFX项目到Android平台。这个示例是我从打包官方示例的例子里修改而来,用于打包一个简单的JavaFX程序。示…

在zookeeper集群的基础上,搭建伪solrCloud集群

伪集群的搭建:将solrCloud搭建到同一台机器上。 准备工作 1 将在window中部署的单机版solr上传到服务器(虚拟机)中 solr的简单部署:在tomcat中启动slor 的内容 这一次放到 mkdir /usr/local/solr-cloud 文件夹内并解压 2 复制4份…

Python-IndexError: list index out of range

Error:IndexError: list index out of range Where? 对Python中有序序列进行按索引取值的时候,出现这个异常 Why? 对于有序序列: 字符串 str 、列表 list 、元组 tuple进行按索引取值的时候,默认范围为 0 ~ len(有序序列)-1&…

摆脱困境:向REST API添加验证

我对此感到有些to愧,但直到昨天,我才知道我可以使用Valid和RequestBody批注将验证添加到REST API中。 这在Spring MVC 3.0中不起作用,由于某种原因,我没有注意到在Spring MVC 3.1中添加了对此功能的支持 。 我从不喜欢旧的方法&am…

三星 原生android,原生Android 4.0 三星GALAXY Nexus评测

前言:北京时间10月19日上午10时,谷歌联合三星在香港举行了一场主题为“Calling all possibilities ”的新品发布会,在发布会上正式推出了搭载最新Android 4.0操作系统的智能手机三星GALAXY Nexus。三星GALAXY Nexus每一代的Nexus都被看做是An…

css类选择器类名覆盖优先级

code <style>.a{background: red;}.b{background: yellow;} </style> <div class"a b">A</div> 渲染效果 最初以为更改元素中class类里面的类名顺序&#xff0c;渲染效果就会根据类名顺序依次渲染code <style>.a{background: red;…

IntelliJ IDEA插件-常用插件

IntelliJ IDEA的插件真的很多&#xff0c;最近的新版集成的插件已经基本够用&#xff0c;下面是收集的一些常用插件&#xff0c;根据需要来安装和测试。如果还是没有找到&#xff0c;那么自己来开发一个。 官网&#xff1a;https://plugins.jetbrains.com/ 插件开发资料&#x…

CMD命令锦集

虽然随着计算机产业的发展&#xff0c;Windows 操作系统的应用越来越广泛&#xff0c;DOS 面临着被淘汰的命运&#xff0c;但是因为它运行安全、稳定&#xff0c;有的用户还在使用&#xff0c;所以一般Windows 的各种版本都与其兼容&#xff0c;用户可以在Windows 系统下运行DO…

在运行时访问工件的Maven和SCM版本

您可以轻松地告诉Maven在JAR清单文件中包含工件的版本及其Git / SVN /…修订版&#xff0c;然后在运行时通过getClass&#xff08;&#xff09;。getPackage访问该信息。 getImplementationVersion&#xff08;&#xff09; 。 &#xff08;所有功劳归功于MarkusKrger和其他同事…

Bootstrap学习笔记01

1、Make Images Mobile Responsive 用处&#xff1a; 使图片适配你的页面宽度。 操作&#xff1a; 给图片添加 .img-responsive class属性。 <img src"/images/cat.jpg" class"img-responsive"> 2、Center Text with Bootstrap 用处&#xff…

linux开机启动nginx

1.从创建文件nginx 位置/etc/init.d/nginx 2.粘贴内容 #!/bin/sh # # nginx - this script starts and stops the nginx daemon # # chkconfig: - 85 15 # description: Nginx is an HTTP(S) server, HTTP(S) reverse \ # proxy and IMAP/POP3 proxy server #…

您可能不知道的五个高级Java同步器

除了基于每个Java对象具有的锁定位的通用同步外&#xff0c;您还可以使用Java中更复杂的同步器&#xff0c;例如&#xff1a; 信号量 –使用许可的概念表示一个位置中允许的最大线程数。 当使用值1时&#xff0c;其行为类似于同步&#xff0c;也称为二进制信号量。 但是&#…

2017-2018-2 20179216 《网络攻防与实践》 SQL注入攻击

1. SQL语言 结构化查询语言(Structured Query Language)简称SQL&#xff1a;是一种特殊目的的编程语言&#xff0c;是一种数据库查询和程序设计语言&#xff0c;用于存取数据以及查询、更新和管理关系数据库系统&#xff1b;同时也是数据库脚本文件的扩展名。 2. SQL注入 SQL注…

借百度爸爸下蛋的好看搜索框

学习vue时写的一个小demo 虽然实现很简单&#xff0c;但还是推介看看&#xff0c;没什么难点&#xff0c;而且有些东西你可能会用到&#xff01;在线演示demo源码

数据库关系

第1层&#xff1a;高并发、高速查询 memory cached(内存高速缓存数据库)第2层&#xff1a;持久化保存 redis第3层&#xff1a;数据保存1、sql server,mysql,sqlite等关系型数据库2、mongo db 在很大程度上&#xff0c;redis可以替代mongo db&#xff08;持久化、文件保存&#…