前言

在之前的一篇文章中我们快速学习了lambda和Stream,本章节中我们来回顾和理解函数式编程的思想。 我们不断的提及函数式这个名词,它指的是lambda吗?如果是这样,采用函数式编程能为你带来什么好处呢?
函数式的思考
命令式编程
一般我们实现一个系统有两种思考方式,一种专注于如何实现,比如下厨做菜,通常按照自己熟悉的烹饪方法:首先洗菜, 然后切菜,热油,下菜,然后…… 这看起来像是一系列的命令合集。对于这种”如何做”式的编程风格我们称之为命令式编程, 它的特点非常像工厂的流水线、计算机的指令处理,都是串行化、命令式的。
CookingTask cookingTask = new CookingTask(); cookingTask.wash(); cookingTask.cut(); cookingTask.deepFry(); cookingTask.fried(); ...
声明式编程
还有一种方式你关注的是要做什么,我们如果用lambda和函数式来解决上述问题应该是这样的:
public class CookingDemo {
public void doTask(String material, Consumer<String> consumer) {
consumer.accept(material);
}
public static void main(String[] args) {
CookingDemo cookingDemo = new CookingDemo();
cookingDemo.doTask("蔬菜", material -> System.out.println("清洗" + material));
cookingDemo.doTask("蔬菜", material -> System.out.println(material + "切片"));
cookingDemo.doTask("食用油", material -> System.out.println(material + "烧热"));
cookingDemo.doTask("", material -> System.out.println("炒菜"));
}
}
这里我们将烹饪的实现细节交给了函数库,它最大的优势在于你读起来就像是在问题陈述,采用这种方式我们很快可以理解它的功能, 当你在烹饪流程中添加其他步骤也变得非常简单,你只需要调用doTask方法将材料传递进去处理,比如在食用油烧热前我要打个鸡蛋
cookingDemo.doTask("鸡蛋", material -> System.out.println(material + "打碎搅拌均匀"));
而不用再编写一个处理鸡蛋的方法。
什么是函数式编程
对于“什么是函数式编程”这一问题最简化的回答是“它是一种使用函数进行编程的方式”。 每个人的理解都是不同的,其核心是:在思考问题时,使用不可变值和函数,函数对一个值进行处理,映射成另一个值。
不同的语言社区往往对各自语言中的特性孤芳自赏。现在谈Java程序员如何定义函数式编程还为时尚早, 但是,这根本不重要!我们关心的是如何写出好代码,而不是符合函数式编程风格的代码。
我们想象一下设计一个函数,输入一个字符串类型和布尔类型参数,输出一个整形参数。
int pos = 0;
public Integer foo(String str, boolea flag){
if(flag && null != str){
pos++;
}
return pos;
}
这个例子有输入也有输出,同时每次调用也可能会更行外部的变量值,这样的函数我们称之为是有副作用的函数。
在函数式编程的上下文中,一个“函数”对应于一个数学函数:它接受零个或多个参数,生成一个或多个结果,并且不会有任何副作用。 你可以把它看成一个黑盒,它接收输入并产生一些输出,像下面的函数
public Integer foo(String str, boolea flag){
if(flag && null != str){
return 1;
}
return 0;
}
这种类型的函数和你在Java编程语言中见到的函数之间的区别是非常重要的(我们无法想象,log或者sin这样的数学函数会有副作用)。 尤其是,使用同样的参数调用数学函数,它所返回的结果一定是相同的。这里,我们暂时不考虑Random.nextInt这样的方法,
函数的副作用
当谈论“函数式”时,我们想说的其实是“像数学函数那样——没有副作用”。由此,编程上的一些精妙问题随之而来。 我们的意思是,每个函数都只能使用函数和像if-then-else这样的数学思想来构建吗? 或者,我们也允许函数内部执行一些非函数式的操作,只要这些操作的结果不会暴露给系统中的其他部分? 换句话说,如果程序有一定的副作用,不过该副作用不会为其他的调用者感知,是否我们能假设这种副作用不存在呢? 调用者不需要知道,或者完全不在意这些副作用,因为这对它完全没有影响。
当我们希望能界定这二者之间的区别时,我们将第一种称为纯粹的函数式编程,后者称为函数式编程。
在编程实战中我们很难用Java语言以纯粹的函数式来完成一个程序的,因为很多老的代码包括标准库的函数都是有副作用的 (调用Scanner.nextLine就有副作用,它会从一个文件中读取一行, 通常情况两次调用的结果完全不同)。你希望为你的系统 编写接近纯函数式的实现,需要确保你的代码没有副作用。假设这样一个函数或者方法,它没有副作用,进入方法体执行时会对一个字段的值加一, 退出方法体之前会对该字段减一。对一个单线程的程序而言,这个方法是没有副作用的,可以看作函数式的实现。
我们构建函数式的准则是,被称为“函数式”的函数或方法都只能修改局部变量,除此之外,它引用的对象都应该是final的。 所有的引用类型字段都指向不可变对象。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者使用java8能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对的支持。
# JAVA8函数式
# java8函数式编程入门
# java函数式编程
# 解析
# 深入浅出讲解Java8函数式编程
# Java8新特性:函数式编程
# JAVA8之函数式编程Function接口用法
# 浅析Java8的函数式编程
# Java8函数式编程应用小结
# 的是
# 都是
# 是有
# 多个
# 是这样
# 你在
# 热油
# 称之为
# 一个函数
# 这一
# 我要
# 是在
# 也有
# 会有
# 为时尚早
# 就像
# 你可以
# 尤其是
# 很难
# 就有
相关文章:
c# 在高并发下使用反射发射(Reflection.Emit)的性能
如何通过WDCP绑定主域名及创建子域名站点?
微课制作网站有哪些,微课网怎么进?
云南网站制作公司有哪些,云南最好的招聘网站是哪个?
平台云上自助建站如何快速打造专业网站?
如何在云主机上快速搭建网站?
建站主机是什么?如何选择适合的建站主机?
,交易猫的商品怎么发布到网站上去?
攀枝花网站建设,攀枝花营业执照网上怎么年审?
如何制作网站标识牌,动态网站如何制作(教程)?
官网自助建站系统:SEO优化+多语言支持,快速搭建专业网站
长沙做网站要多少钱,长沙国安网络怎么样?
电商网站制作公司有哪些,1688网是什么意思?
PHP正则匹配日期和时间(时间戳转换)的实例代码
C++时间戳转换成日期时间的步骤和示例代码
如何规划企业建站流程的关键步骤?
如何选择建站程序?包含哪些必备功能与类型?
php8.4新语法match怎么用_php8.4match表达式替代switch【方法】
天津个人网站制作公司,天津网约车驾驶员从业资格证官网?
网站按钮制作软件,如何实现网页中按钮的自动点击?
齐河建站公司:营销型网站建设与SEO优化双核驱动策略
用v-html解决Vue.js渲染中html标签不被解析的问题
制作网站的公司有哪些,做一个公司网站要多少钱?
如何在Golang中实现微服务服务拆分_Golang微服务拆分与接口管理方法
,石家庄四十八中学官网?
如何配置WinSCP新建站点的密钥验证步骤?
网站网页制作电话怎么打,怎样安装和使用钉钉软件免费打电话?
如何选择可靠的免备案建站服务器?
如何选择美橙互联多站合一建站方案?
北京企业网站设计制作公司,北京铁路集团官方网站?
php json中文编码为null的解决办法
建站之星安装模板失败:服务器环境不兼容?
如何将凡科建站内容保存为本地文件?
武汉网站设计制作公司,武汉有哪些比较大的同城网站或论坛,就是里面都是武汉人的?
江苏网站制作公司有哪些,江苏书法考级官方网站?
高端网站建设与定制开发一站式解决方案 中企动力
建站VPS能否同时实现高效与安全翻墙?
深入理解Android中的xmlns:tools属性
如何用5美元大硬盘VPS安全高效搭建个人网站?
建站之星官网登录失败?如何快速解决?
建站VPS配置与SEO优化指南:关键词排名提升策略
,怎么用自己头像做动态表情包?
如何制作新型网站程序文件,新型止水鱼鳞网要拆除吗?
建站之星展会模版如何一键下载生成?
建站之星2.7模板:企业网站建设与h5定制设计专题
c# 在ASP.NET Core中管理和取消后台任务
*服务器网站为何频现安全漏洞?
制作网站的基本流程,设计网站的软件是什么?
如何在西部数码注册域名并快速搭建网站?
如何通过VPS搭建网站快速盈利?
*请认真填写需求信息,我们会在24小时内与您取得联系。