功能与命令式编程。 Java 8中的斐波那契,素数和阶乘

有多种编程风格/范例,但是两种著名的风格是ImperativeFunctional

命令式编程是最主要的范例,因为几乎所有主流语言(C ++,Java,C#)都在推广它。 但是在最近几年中,函数式编程开始受到关注。 主要驱动因素之一是,仅所有新计算机都带有4、8、16或更多核,并且以命令式方式编写并行程序以利用所有核非常困难。 功能风格将这种困难转移到了运行时级别,并使开发人员摆脱了繁琐且容易出错的工作。

等待! 那么这两种样式有什么区别。

命令式编程是一种范例,您可以在其中说明如何准确地执行机器/运行时语句以及应该执行哪些准确的语句以达到所需的结果。

函数式编程是声明性编程范式的一种形式,您可以在其中声明要实现的目标,而机器/运行时将确定最佳的实现方式。

功能风格将方式部分移至运行时级别,并帮助开发人员专注于一部分。 通过抽象如何部分我们可以写出更好的可维护性和可扩展的软件。

为了应对多核计算机带来的挑战并保持对开发人员的吸引力, Java 8引入了紧随其后的功能范式。

有足够的理论,让我们使用Java来实现命令式和函数式编程中的几个编程难题,然后看看它们之间的区别。

斐波那契数列命令式与功能性 (斐波那契数列是数字的序列:1、1、2、3、5、8、13、21、34,…。下一个数字是通过将前面的两个数字相加而得出的。)

斐波那契数列的迭代式和命令式

public static int fibonacci(int number) {int fib1 = 1;int fib2 = 1;int fibonacci = fib1;for (int i = 2; i < number; i++) {fibonacci = fib1 + fib2;fib1 = fib2;fib2 = fibonacci;}return fibonacci;
}for(int i = 1; i  <= 10; i++) {System.out.print(fibonacci(i) +" ");
}
// Output: 1 1 2 3 5 8 13 21 34 55

正如你可以在这里看到我们的重点是如何 (迭代状态)很多,而这正是我们想要实现的。

斐波那契数列的迭代式和函数式

IntStream fibonacciStream = Stream.iterate(new int[]{1, 1},fib -> new int[] {fib[1], fib[0] + fib[1]}).mapToInt(fib -> fib[0]);fibonacciStream.limit(10).forEach(fib ->  System.out.print(fib + " "));
// Output: 1 1 2 3 5 8 13 21 34 55

相反,你可以在这里看到我们的重点是我们要达到的目标

质数命令式与功能性素数(质数是大于1的自然数,除1本身以外没有正除数。)

命令式素数

public boolean isPrime(long number) {  for(long i = 2; i <= Math.sqrt(number); i++) {  if(number % i == 0) return false;  }  return number > 1;  
}
isPrime(9220000000000000039L) // Output: true

再次,我们在此重点关注如何 (迭代,状态)。

功能风格的素数

public boolean isPrime(long number) {  return number > 1 &&  LongStream.rangeClosed(2, (long) Math.sqrt(number))  .noneMatch(index -> number % index == 0);
}
isPrime(9220000000000000039L) // Output: true

在这里我们再次的重点是我们要达到的目标 。 函数式样式帮助我们抽象出了在数字范围内进行显式迭代的过程。

您现在可能会想,嗯,这就是我们所能拥有的一切……。 ? 让我们看看如何以功能风格使用所有核心(获得并行性)。

public boolean isPrime(long number) {  return number > 1 &&  LongStream.rangeClosed(2, (long) Math.sqrt(number)).parallel()  .noneMatch(index -> number % index == 0);
}
isPrime(9220000000000000039L) // Output: true

而已! 我们只是将.parallel()添加到流中。 您可以看到库/运行时如何为我们处理复杂性。

阶乘命令式与函数式 (n的阶乘是所有小于或等于n的正整数的乘积。)

迭代式和命令式的阶乘

public long factorial(int n) {long product = 1;for ( int i = 1; i <= n; i++ ) {product *= i;}return product;
}
factorial(5) // Output: 120

迭代和功能风格的阶乘

public long factorial(int n) {return LongStream.rangeClosed(1, n).reduce((a, b) -> a *   b).getAsLong();
}
factorial(5) // Output: 120

值得重申的是通过抽象如何部分我们可以写出更好的可维护性和可扩展的软件。

要查看Java 8引入的所有功能特性,请查看以下Lambda表达式,方法参考和流指南。

翻译自: https://www.javacodegeeks.com/2015/12/functional-vs-imperative-programming-fibonacci-prime-factorial-java-8.html

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

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

相关文章

Yandex.Algorithm 2011 Round 2 D. Powerful array 莫队

题目链接&#xff1a;点击传送D. Powerful arraytime limit per test5 secondsmemory limit per test256 megabytesinputstandard inputoutputstandard outputAn array of positive integers a1, a2, ..., an is given. Let us consider its arbitrary subarray al, al  …

html 形状div,div+css实现各种形状(精心整理)

1.正方形.div {width: 100px;height: 100px;background: red;}2.矩形.div {width: 200px;height: 100px;background: red;}3.圆形.div {width: 100px;height: 100px;background: red;-moz-border-radius: 50px;-webkit-border-radius: 50px;border-radius: 50px;}4.椭圆.div {w…

4.1.5事件

用事件有一种监听的思想 一个事件对应一个委托 事件是委托类型 一个事件对应一个委托&#xff0c;委托可以对应多个方法 如气球爆炸了 气球的反应 小孩的反应 事件源有代码自动激发事件 扔出事件 —————————————— 3.只能在类的内部触发事件 4.可以在内部…

485不用双绞线可以吗_现在在上海,挡风玻璃可以一个标志都不用贴吗?

问近日&#xff0c;有市民咨询&#xff1a;现在在上海&#xff0c;车上挡风玻璃可以一个标志都不用贴吗&#xff1f;答可以一个标志都不贴。自2020年3月1日起&#xff0c;本市机动车在本市办理注册、变更、转移登记和核发检验标志、补换检验标志业务时&#xff0c;将自动生成检…

Java和Python中类似Kotlin的生成器,续:附加参数

介绍 在今天的文章中&#xff0c;我们将继续上周的文章&#xff0c;内容涉及用Java和Python制作类似于Kotlin的构建器&#xff0c;扩展构建器API以采用一些可选参数来提高灵活性。 我们继续我们HTML示例&#xff0c;尝试添加标记属性&#xff0c;例如类&#xff0c;id和样式。 …

vs2015 html页面没有试图,vs2015 web设计视图假死,求帮助

你好&#xff0c;首先&#xff0c;请在发送一个请求去验证你的MSDN账号。然后&#xff0c;从你的描述来看&#xff0c;即使创建新项目&#xff0c;VS的design界面出现不了还是你的VS安装有问题。我们可以从两方面考虑&#xff1a;1.系统环境建议你检查一下Windows系统更新&…

nodejs 之 nvm和pm2

说道 node不得不提到nodejs的版本管理nvm和Node应用的进程管理器pm2。 当然&#xff0c;关于这两个的介绍的文章那么多&#xff0c;随意baidu,bing,google就可以。 我这里是给自己打一个标签&#xff0c;方便日后 查询&#xff0c; 二是方便一些和我一样的小白&#xff0c;能速…

2021上饶市高考中考成绩查询,2021年上饶中考成绩公布查询时间 上饶中考成绩查询方式入口...

2018年上饶中考成绩公布查询时间 上饶中考成绩查询方式入口2018年上饶高考结束了&#xff0c;可是上饶中考又来了!6月注定是一个不平淡的月份。又一大批孩子朝着青春出发踏着坚定的脚步&#xff0c;行走在如火的六月。宁静的清晨&#xff0c;静谧的夜&#xff0c;那条反反复复走…

vue 实例化几种方式_vue注册组件的几种方式总结

vue注册组件的几种方式总结 1、全局注册(这种方式注册组件必须在vue实例化之前声明) Vue.component(tag-name,{}) 2、局部注册 var Child = {template: A custom component! } new Vue({// ... components: {// 将只在父模板可用 my-component: Child } }) 3、扩展实例 // 定…

gson json和类转换_带有GSON和抽象类的JSON

gson json和类转换经过多年使用org.json库在Java中支持JSON数据交换格式后&#xff0c;我已切换到Google Gson 。 org.json是一个较低层的库&#xff0c;因此您必须创建JSONObject&#xff0c;JSONArray&#xff0c;JSONString等…并执行其他低层工作。 Gson简化了这项工作。 它…

自考18年4月计算机应用基础,2019年自学考试计算机应用基础试题(18)

2019年4月自考报名已经拉开序幕&#xff0c;同学们可以开始准备自考复习&#xff0c;下面是2019年自学考试计算机应用基础试题(18)&#xff0c;了解更多自学考试资讯请锁定自学考试网&#xff0c;更有海量模拟试题&#xff0c;精品复习资料等你来下载!1.Windows 中删除文件夹的…

git中文件的三种状态

用xcode的时候&#xff0c;左侧栏文件的邮右边时不时会看到M&#xff0c;A这一类的字母。当然&#xff0c;这些以后再写上。先说一下git里文件的三种状态 已提交&#xff08;committed&#xff09; 已经提交的本地仓库&#xff08;repository&#xff09;&#xff0c;需要手动…

创建一个带参数的formgoup_gin框架如何获取带文件的formData请求?

**前端代码如下**function upFile() {var formData new FormDatavar file document.getElementById("upload").files[0]var text document.getElementById("text").valueformData.append("upload",file)formData.append("text",tex…

如何从URL查询字符串获得/附加视图参数(示例)?

让我们剖析几个简单的用例&#xff0c;并查看视图参数的工作原理&#xff08;视图参数名称不是强制性的&#xff0c;以匹配通过URL查询字符串传递的请求参数&#xff0c;但在本文中&#xff0c;我们将重点讨论这种情况&#xff09;&#xff1a; 情况1 在index.xhtml页面中&…

桌面怎么设置 计算机 网络,Win10 10130桌面电脑网络图标怎么设置?

越来越多朋友的计算机安装Windows10系统&#xff0c;现在Windows10系统已经升级到10130版&#xff0c;我的计算机升级到了10130版。安装Windows10的10130版系统后&#xff0c;桌面只有回收站和软媒的图标&#xff0c;如何把电脑、网络、用户的文件、控制面板等图标设置到桌面上…

swift 打开第三方应用_iOS卡通人物帧动画入门9(大结局):番外篇-扩展第三方类

扩展第三方类细心的朋友可能会发现&#xff0c;我们前面计算主角的大小用的总是同一方向第一帧纹理的大小&#xff0c;如果纹理大小有出入的话&#xff0c;会产生较大的偏差&#xff0c;最好的方法是取当前动画帧纹理的大小。不过这有些难度&#xff0c;所以我们退之求其次&…

awk说明书(转)

ref&#xff1a;http://blog.chinaunix.net/uid-429659-id-122573.html awk使用手册 作者&#xff1a;awk使用手册什么是awk? 你可能对UNIX比较熟悉&#xff0c;但你可能对awk很陌生&#xff0c;这一点也不奇怪&#xff0c;的确&#xff0c;与其优秀的功能相比&#xff0c;awk…

jpa jdbc jndi_没有J2EE容器的JNDI和JPA

jpa jdbc jndi我们希望通过尽可能简单的设置来测试一些JPA代码。 计划仅使用Java和Maven&#xff0c;不使用应用程序服务器或其他J2EE容器。 我们的JPA配置需要两件事才能成功运行&#xff1a; 数据库来存储数据&#xff0c; JNDI访问数据库。 这篇文章分为两个部分。 第一部…

本科计算机应用水平,湖南工程学院全日制非计算机专业本科生参加湖南省计算机应用水平等级考试的规定...

根据省教育厅《关于印发湖南省普通高等学校非计算机专业学生计算机应用水平等级考试大纲的通知》(湘教发〔2012〕58号)精神&#xff0c;经研究&#xff0c;现对我校全日制非计算机专业本科生参加计算机等级考试有关事项作如下规定&#xff1a;1&#xff0e;凡我校全日制非计算机…

Linux umask限制导致php的mkdir 0777无效

原因:mkdir权限受当前linux umask限制 解决方法: 1 $oldmask umask(0); 2 mkdir("test", 0777); 3 umask($oldmask); 参考SO:http://stackoverflow.com/a/3997671/4009148转载于:https://www.cnblogs.com/gy1010/p/6674243.html