当前位置:首页 » 编程语言 » java什么是函数式编程

java什么是函数式编程

发布时间: 2022-06-15 17:34:57

‘壹’ 到底什么是函数式编程思维

形而上的思维:
1、数据不可变的思维:let a = 100,意义不是把100赋值给变量a,而是把a符号绑定(或者叫匹配)到100。
2、一切皆表达式思维:if b then 100 else 10,这不是条件跳转,而是一个三元表达式。
3、函数是第一类值:函数可以作为参数传输,也可以作为结果返回,更可以由一个函数演化成另一个函数。

形而下的思维:
1、用递归替换循环。
2、难以尾递归的时候考虑使用延续函数(continuation)。
3、高阶函数、部分应用、Lambda演算。
4、用泛型、接口、可区别联合类型替换类继承。
5、用二叉树替换普通链表后可以支持高并发计算。
===================================================

这些也只是feature而不是思维。我想知道的是这些feature之后的逻辑。
-----------------------------------------------------------------------------------------------------
再往上说就不接地气了,先从函数式语言说起,函数式语言其实就是模仿人的数学思维而发明的朴素,后来因为离机器太远,不容易优化而被诟病。但科技发展到今天,编译器的优化能力已经很强,软件系统越来越复杂,人的分工越来越细,函数式语言离数学更近,离机器更远,反而成为一种优势,有助于人把问题清晰化。从这个层面看,函数式编程是一种什么思维,就是推离机器的数学思维。这里没有内存、寄存器的想法,在 a=1之后,a 就不可能再等于2,当然你可以在 let a = 1 之后,再 let a = 2,但是这个a 就已经不是那个a,在停留在有内存概念的编程世界里,a 一直是 a,它是装东西的桶或者盒子,只是每次里面装的东西不同。

那么,总的来说,是先有朴素的函数式语言,然后才有今天发现函数式编程的好处, 启用了函数式语言的某些 feature,目的是为了把问题解构成更小的粒度。所以这些feature背后没什么逻辑,就好像问这石头为什么长这样一样。我只能打句偈语:本来就这样。

‘贰’ 为什么函数式编程在java中很危险

因为java是面向对象编程,其特点是易于扩展,开发可重用性非常高。软件开发中需求变更时很频繁的。面向过程编程可以很好的应对需求变更,增加扩展功能。函数式编程则不具有这种特点,而且维护起来也十分困难,不利于他人的工作交接。不提倡在java中使用函数式编程。

‘叁’ 如何理解java8中的函数式编程

JAVA如果真的这么完美无缺,那为什么还会有其他语言的兴盛呢?所以说,没有一样东西是绝对完美的,JDK8包括之后的版本,就是不断的完善JAVA语言,让它往更好的方向上去走,面向过程有它的缺点,然而无疑也有它的优点,在JAVA8 之前,JAVA欠缺了高效的并行操作,写一个并行程序代码往往是费事费力又不讨好,然而在JAVA8之上,只需要简单的修改几行代码,就可以让代码在多核CPU上完美运行,所以为了达到这个效果,编写这样的JDK类库,就需要在语言层次上修改现有的JAVA,因此,在JAVA中增加Lambda表达式就是刻不容缓的任务了--事实上在2011年的JDK7版本中预计就要引入Lambda,但是因为种种原因,计划最终推迟到了2014年的JDK8。
  为了达到高效操作集合类,实现并行计算或者操作的目的,你得要学习来自JDK8的新的语法,并且要从面相对象编程的局限中稍微跳出来一些,但是比起之前手写一大段代码,我觉得这样的学习是十分值得也是十分必要的,节省了时间与成本,同时也更不容易出错!站在巨人的肩膀上,这是任何一个人都需要借鉴的方法,为什么每次JDK版本的变更都历时几年?oracle的工程师并不是傻瓜,尤其是在编写JDK类库上,借用他人的代码并不是可耻的行为,新的代码更加高效,并且更让人容易阅读,这种新代码更加关注的它所实现的业务逻辑,而并非实现机制,所以你看即使是引入了Lambda,从某种意义上来说,这依旧是面向对象的一种实现方法--关注的并非实现机制,这样的代码更容易维护,也更不容易出错。

‘肆’ 什么是函数式编程思维

回答都有跑题,show概念之嫌,题主问的是函数式思维,这个问题我一直在思考,毕竟是方法论,能力有限,只能从切身实践告诉你
1.表达式化

最初的时候,需要转变观念,去可变量,去循环,把命令式改成表达式,注意,这只是把你丢在荒山野岭让你感受一下,离开熟悉的环境,地球依然在转,但是有个
重点,那就是一切都是表达式; 为什么是表达式呢?这个问题就像为什么鱼在水里?
因为函数式建立在lambda演算之上而非图灵机,只不过两者被证明等价,所以你可以在你的机器上跑全是表达式的代码,就如有人证明天空适合鱼生存,所以
鱼可以在天上游
当你接受了鱼可以在天上游之后,就该上正餐了

1.5 数据与行为分离
这也是和面向对象不一致的地方,面向对象强调数据与行为绑定,但函数式不是,确切的说函数式 函数与数据等价,所以你才可以将函数当参数与返回值,你在设计时,切勿让数据自己长腿能跑,其次,行为必须消除副作用,不可以偷偷把数据改了,习惯第一条后,应该不会的

2.高阶逻辑

了函数式,就不要在想循环,赋值这些低阶逻辑了,而应该更高阶的思考问题,这比转化表达式更难,函数式又叫声明式,也就是你要做什么,只要说一下就行,而
非写个遍历,做个状态判断,用函数式你不需要考虑这些,你不知道函数式的列表是怎么遍历的,中间向两边?
从后往前?这也是为何函数式适合并发的原因之一,你想知道列表中大于3的数有多少,只要,list.count(_ > 3)
而不是写循环,你可以直接写你的业务,不要拘泥于细节,有点像sql, 你需要什么告诉电脑就行,你或许会问,count foreach filter
这些函数怎么来的? 因为有了他们你才不需要写循环,他们把你留在高阶逻辑中,这个问题的答案请看下面

3.组合子逻辑 或又叫 自底向上的设计

数式和OO是反的,面向对象是自顶向下的设计,函数式是自底向上的设计,也就是先定义最基本的操作,然后不断组合,不断堆积以满足你的所有需要,如sql
定义了select, from, where...这几个组合子,来满足你的查询需求,同理函数式语言会提供foreach,
map等组合子(操作)来满足你的需求,所以你必须自下而上的设计你的代码结构,并且满足你的需求,当你只用组合子写代码时,你会发现你写的全是高阶逻辑

果这些已有组合子满足不了你,你就得自己写,foreach不行,你就自己写递归,我告诉你,递归背后也是组合子,这里一些'大神'应该不知道,在图灵机
里,递归就是方法不断调用自己没什么好说的,但是在lambda演算中,匿名函数是没法调用自己的,所以递归是用Y组合子(又叫不动点组合子)把递归函数
自己求解出来再调用的,这才可以实现递归,并与图灵机的循环等价,有点跑题了,总之要想顺手的写函数式,最好用面向组合子的设计,注意,不是必须,组合子
演算和lambda演算可以相互转化,也就是,你完全可以写一堆杂乱的表达式,但没有组合子逻辑来得清爽,Haskell大规模使用monad这个特殊组
合子,始其变得统一整洁

好了,总结一下
函数式思维,其实就是组合子逻辑,用简单的几个函数组合来构建复杂逻辑,始终以高阶的角度去表达问题,而非依赖副作用。
知道这点,你用java也可以写函数式代码了

但是,这也只是本人积累得来的感悟,绝不敢大肆伸张这就是函数式,我也在不断研究中,如有问题,还望大神指正

‘伍’ java8 函数式编程是什么

java8完全颠覆我们对java的认识了 函数式编程里面有一点就是 把一段函数当作是一个参数来进行传递

‘陆’ php,java,c,python 语言各有什么不同

简单的说,它们都是编程语义。是在第三代和第四代编程语言。 都和C有关系。 低层解释器都是C写的。都存在进程管理和数据交换。都支持网络编程,数据库编程。 相互之间可以通讯。

具体来讲,对于个掌握多门语言的程序员来讲,它们之间差别巨大,以至于没有人可以同时精通几门语言。网上简历所谓的熟练与精通,几乎全是假的。

php相对最容易。是函数式编程, java虽然是面向对象的,使用特定的模式后,也可以支持类函数式编程。 c语言是函数式的。 python也是。 但是原则上,它们都同时支持面向对象的编程思维。只是表达方式比较特别。

c语言是比php略难,也是相当容易的语言。
java的工具强大,是一个工程语言。容易学,学精难,工具丰富 ,大多数人在用。是目前最主流的网络服务编程语言。

python仍然是脚本语言之王。 易学,易用,难精通。接口非常丰富。无所不能。

‘柒’ java支持的编程范式

Java编程范式

1.命令式编程
核心内容就是:“用语句更改程序的状态”
大多数流行的编程语言都或多或少基于命令式编程发展而来,命令式语言最典型的实例就是C语言

2.面向对象编程
面向对象编程经常与命令式编程联系在一起,在实践当中,两者是可以共存的。Java就是这种协作的生动证明
面向对象基于四个基本原则:封装、继承、多态、抽象

3.声明式编程
与命令式编程相反,声明式编程它指定程序应该做什么,而不具体说明怎么做。
纯粹的声明式语言包括数据库查询语言(如SQL和Xpath)以及正则表达式。
与命令式编程语言相比,声明式编程语言更加抽象,它们并不模拟硬件结构,因此不会改变程序状态,而是将它们转换为新状态,并且更接近数学逻辑
通常,非命令是的编程范式都被认为属于声明式类别。

4.函数式编程
函数式编程是声明式编程的子范式,与命令式编程相反,函数式变成不会改变程序的内部状态。
在函数式编程术语中,函数类似于数学函数,函数的输出仅依赖于其参数,而不管程序的状态如何,完全不受函数式是何时执行的影响
函数式语言受欢迎的原因之一是它们可以轻松的在并行环境中运行,这与多线程不太一样,函数式语言支持并行的关键在于它们的基本原理:函数仅依赖与输入参数而不依赖于程序的状态。它们可以在任何地方运行,然后将多个并行执行的结果连接起来并进一步使用

‘捌’ java如何编程

呵呵 问题很有意思!你要是懂编程就知道java是如何编程的了!!!! 编程 :简单的说,编程就是为了借助于计算机来达到某一目的或解决某个问题,而使用某种程序设计语言编写程序代码,并最终得到结果的过程。
计算机虽然功能十分强大。可以供你上网、打游戏、管理公司人事关系等等,但是没有程序,它就等于是一堆废铁,不会理会我们对它下达的“命令”。于是,我们要驯服它,只有通过一种方式——程序,这也是我们和计算机沟通比较特殊的方式。 [编辑本段]编程原理程序也就是指令的集合,它告诉计算机如何执行特殊的任务。打个比方说,它好比指导你烹调菜品的菜谱或指挥行驶一路到达目的地的交警(或者交通路标)。没有这些特殊的指令,就不能执行预期的任务。计算机也一样,当你想让计算机为你做一件事情的时候,计算机本身并不能主动为我们工作,因此我们必须对它下达指令,而它根本不会也不可能听懂人类自然语言对事情的描述,因此我们必须使用程序来告诉计算机做什么事情以及如何去做?甚至对最简单的任务也需要指令,例如如何取得击键,怎样在屏幕上放一个字母,怎样在磁盘中保存文件等等。
上面讲到的计算机本身不会主动的做任何事情。因此我们要通过程序的方式来让计算机为我们“效劳”。而这个过程就是我们“编”出来的。编程可以使用某一种程序设计语言来实现,按照这种语言的语法来描述让计算机要做的事情。
我们这里所讲的语法和外语中的语法完全两码事,这里讲的语法只是读你的程序书写做出一些规定而已。写出程序后,再由特殊的软件将你的程序解释或翻译成计算机能够识别的“计算机语言”,然后计算机就可以“听得懂”你的话了,并会按照你的吩咐去做事了。因此,编程实际上也就是“人给计算机出规则”这么一个过程。 常见的编程语言:* CSS Cascading Style Sheets 层叠样式表
* .NET 是微软2002年,为开发应用程序创建的一个富有革命性的新平台
* ActionScript ActionScript是Flash的脚本语言,与JavaScript相似,ActionScript是一种面向对象编程语言。
* APL、A+和J
* Ada Ada是一种表现能力很强的通用程序设计语言
* 汇编语言 汇编语言(Assembly Language)是面向机器的程序设计语言
*易语言是全中文语言编程中最为强大的一个编程语言
* AWK AWK是一种优良的文本处理工具
* Basic 是一种设计给初学者使用的程序设计语言
o QBasic QBASIC是BASIC(Beginner's All-purpose Symbolic Instruction Code,初学者通用指令代码)语言的一个变种,由美国微软公司开发
o Visual Basic Visual Basic(VB)是一种由微软公司开发的包含协助开发环境的事件驱动编程语言
* VBScript VBScript是Visual Basic Script的简称,即 Visual Basic 脚本语言
* Brainfuck Brainfuck是一种极小化的计算机语言
* C、C++ 、C# C语言是一种面向过程的计算机程序设计语言 ; C++是一种静态数据类型检查的,支持多重编程范式的通用程序设计语言。它支持过程化程序设计、数据抽象、面向对象程序设计、制作图标等等泛型程序设计等多种程序设计风格。C#是微软公司发布的一种面向对象的、运行于.NET Framework之上的高级程序设计语言。
o Objective-C 通常写作ObjC和较少用的Objective C或Obj-C,是扩充C的面向对象编程语言
* Clipper Clipper芯片主要用于商业活动的计算机通信网
* COBOL 一种适合于商业及数据处理的类似英语的程序设计语言
* dBase dBASE是第一个在微型计算机上被广泛使用的数据库管理系统(DBMS
* PASCAL、Delphi Pascal是一种计算机通用的高级程序设计语言 ;Delphi是全新的可视化编程环境,是一种方便、快捷的Windows应用程序开发工具
* Forth 由Charles H. Moore发展出来在天文台使用的电脑自动控制系统及程序设计语言,允许使用者很容易组合系统已有的简单指令,定义成为功能较复杂的高阶指令。
* Fortran 译为“公式翻译器”,它是世界上最早出现的计算机高级程序设计语言,广泛应用于科学和工程计算领域。
* FoxPro 是由美国Fox Software公司于1988年推出的数据库产品
* F# F#是由微软发展的为微软.NET语言提供运行环境的程序设计语言
* Fava Fava语言是一个小型的解释语言,它主要面向于系统测试领域及小型嵌入式设备。
* IDL IDL 是一种数据分析和图像化应用程序及编程语言
* Java Java是由Sun Microsystems公司于1995年5月推出的Java程序设计语言
* JavaScript Javascript是一种由Netscape的LiveScript发展而来的脚本语言
* J# Visual J# 是一种工具,供 Java 语言程序员用于构建在 .NET Framework 上运行的应用程序和服务
* LISP 一种基于λ演算的函数式编程语言。
* Lua Lua 是一个小巧的脚本语言
* LOGO 是一种早期的编程语言,也是一种与自然语言非常接近的编程语言,它通过“绘图”的方式来学习编程
* Mole 在软件工程中,指较高一级程序或模块使用的一个单元或模块
* Nuva Nuva语言是一种面向对象的动态脚本语言 Nuva语言的设计目的是用于基于模板的代码生成
* Perl Perl 一般被称为“实用报表提取语言”(PracticalExtraction andReportLanguage),也做“病态折中垃圾列表器”(PathologicallyEclectic Rubbish Lister
* PHP PHP 是一种 HTML 内嵌式的语言
* PL/I PL/I是Programming Language One的简写。当中的“I”其实是罗马数字的“一”。它是一只IBM公司在1950年代发明的第三代高级编程语言
* Prolog Prolog(Programming in Logic的缩写)是一种逻辑编程语言
* Python 是一种面向对象的解释性的计算机程序设计语言,也是一种功能强大而完善的通用型语言
* R R是用于统计分析、绘图的语言和操作环境
* Ruby Ruby,一种为简单快捷面向对象编程(面向对象程序设计)而创的脚本语言
* Scheme Scheme,一种系统设计语言,由LISP语言发展而来,属于lisp的一种方言。与其他lisp不同的是,scheme是可以编译成机器码的。Scheme的一个主要特性是可以像操作数据一样操作函数调用
* Smalltalk 一种面向对象的程序设计语言 一种程序设计环境 一个应用开发环境(ADE)
* Tcl/Tk 是一种 脚本语言
* Visual FoxPro Visual FoxPro原名FoxBase,是美国Fox Software公司推出的数据库产品

‘玖’ java lambda表达式是什么

lambda表达式是JAVA8中提供的一种新的特性,它支持JAVA也能进行简单的“函数式编程”。它是一个匿名函数,Lambda表达式基于数学中的λ演算得名,直接对应于其中的lambda抽象(lambda abstraction),是一个匿名函数,即没有函数名的函数。

函数式接口:

这个是理解Lambda表达式的重点,也是产生lambda表达式的“母体”,这里我们引用一个比较容易理解的说法:函数式接口是 一个只有一个抽象方法(不包含object中的方法)的接口。

这个需要说明一点,就是在Java中任何一个对象都来自Object 所有接口中自然会继承自Object中的方法,但在判断是否是函数式接口的时候要排除Object中的方法。

‘拾’ JAVA中构造函数是什么意思

什么是构造函数,问的好。
开始的时候我也不理解为什么要构造函数。因为那时候的设计思想还停留在面向过程编程。即我要干什么事,这件事有几个步骤,然后我决定怎么干。
面向对象不是这么直接简单,它的设计思想就是要代码重用。即我以前干过类似的事,那么我找出以前可以用到的代码,完成一部分。以前没有的我重新写。这样就有了类。
回到你提的问题。有了类,就是有了可以重用的代码,但是我怎么产生这个对象呢。必须要实例化这个类(当然这不是唯一产生对象的途径,比如单例模式,但本质上说所有途径都是一样的)。那么就要用到构造函数。即告诉程序我现在要实例化一个对象了,你给我马上分配内存。将内存的首地址赋给我指定的类对象。而且有时候你需要传递参数到函数里面,有了构造函数就方便了,构造函数可以有无数个。当然,传递参数到到对象里面也可以其它方法,比如直接赋一个值给成员变量,举例:
class point2{
int x,y;

point2(){
}

point2(int a,int b){//构造函数;含参的构造函数;构造方法必须要和类名一致
//且没有返回值
x=a;
y=b;
}
void output(){
System.out.println(x);
System.out.println(y);
}
public static void main(String args[]){
point2 pt=new point2();//实例化对象,这时候x,y没有赋值,默认初始值为0;
pt.output();
pt.x=3;pt.y=3;
pt.output();
}
}

热点内容
怎样删除小视频文件夹 发布:2024-05-19 05:49:29 浏览:589
开启php短标签 发布:2024-05-19 05:44:12 浏览:473
android各国语言 发布:2024-05-19 05:42:54 浏览:247
微信什么资料都没怎么找回密码 发布:2024-05-19 05:35:34 浏览:907
填志愿密码是什么 发布:2024-05-19 05:30:23 浏览:318
城堡争霸自动掠夺脚本 发布:2024-05-19 05:22:06 浏览:204
asp编程工具 发布:2024-05-19 05:20:36 浏览:143
insertpython 发布:2024-05-19 05:12:26 浏览:244
androidant编译 发布:2024-05-19 05:04:11 浏览:988
按键脚本优化 发布:2024-05-19 04:59:57 浏览:752