专栏电商日志财经减肥爱情
投稿投诉
爱情常识
搭配分娩
减肥两性
孕期塑形
财经教案
论文美文
日志体育
养生学堂
电商科学
头戴业界
专栏星座
用品音乐

函数式编程的思维转变从数据参数化到行为参数化

  为什么要了解函数式编程;函数式编程对哪些设计模式产生了影响;如何从数据参数化过渡到行为参数化;策略模式的三种实现方式。
  极客架构师专注架构师成长。
  大家好,我是码农老吴。
  今天是我的《Java极客》系列分享的第一期。
  今天也是2022年的最后一天,经过多天的病毒折磨,刀片桑,咳嗽,浑身无力,都体验了一遍,终于在兔年到来之前,满血复活了。感谢大家的关心,提前一天,祝大家新年快乐,身体健康,职场顺利,万事大吉。
  兔年快乐
  古朗月行
  【作者】李白
  小时不识月,呼作白玉盘。
  又疑瑶台镜,飞在青云端。
  仙人垂两足,桂树何团团。
  白兔捣药成,问言与谁餐。
  蟾蜍蚀圆影,大明夜已残。
  羿昔落九乌,天人清且安。
  阴精此沦惑,去去不足观。
  忧来其如何,凄怆摧心肝。分享思路
  《Java极客》分享内容
  为什么要分享函数式编程
  函数式编程包含哪些内容
  案例说明电商后台的商品过滤功能
  版本1硬编码
  版本2数据参数化
  版本3方案1串行化的多条件过滤
  版本3方案2并行化的多条件过滤
  走出思维死角行为参数化
  版本4基于策略模式
  版本5基于匿名类的策略模式
  版本6基于Lambda表达式的策略模式
  下期预告
  参考书籍《Java极客》分享内容
  《Java极客》这个系列,我将分享Java开发相关的几个比较重要的,有一定难度的专题内容,内容主要涉及:函数式编程,泛型编程,并发编程,JVM等。为什么要分享函数式编程
  一个最直接的原因,就是因为函数式编程,对我们目前正在分享的设计模式,其中的好几个设计模式,都产生了比较大的影响,比如策略模式,模板方法模式,观察者模式,责任链模式,工厂模式等等。为了方便大家,更好的学习函数式编程下的设计模式,我决定把Java中的函数式编程功能,系统的分享一下。函数式编程包含哪些内容
  众所周知,Java语言并不是天生的函数式编程语言,只是在新的时代需求下(大数据分析和CPU多核时代),Java语言,特别是Java8,发展出来的,支持函数式编程的新功能。
  内容主要包括:行为参数化,Lambda表达式,方法引用,流操作等等。
  今天,我们就从行为参数化开始。案例说明电商后台的商品过滤功能
  电商后台,难免对商品进行各种查询,统计,大多数情况下,通过数据库就可以完成,如果数据量非常大的情况下,还会用上大数据系统。当然,如果具体到店铺级别,一般商品的数量是可控的,量级不会太大(10万级别,不超过百万),直接使用Java集合框架,在内存中直接对商品进行查询,过滤,统计等操作,也是比较简洁,高效的。由于函数式编程的流操作,主要是通过集合框架进行数据操作的。所以我们主要以集合框架对数据进行分析。
  商品实体类类图及代码如下:商品(SKU)类图
  packagecom。geekarchitect。javageek。module001。demo01;importlombok。Data;author极客架构师吴念createTime20221229DatapublicclassSKU{privateLongid;privateStringname;privateLongcategoryId;privateStringcategoryName;privateDoubleprice;privateLongshopId;privateStringshopName;privateintsales;销售量privateintstock;库存量publicSKU(){}publicSKU(Longid,Stringname,LongcategoryId,StringcategoryName,Doubleprice,LongshopId,StringshopName,intsales,intstock){this。idid;this。namename;this。categoryIdcategoryId;this。categoryNamecategoryName;this。priceprice;this。shopIdshopId;this。shopNameshopName;this。salessales;this。stockstock;}}
  模拟数据如下:packagecom。geekarchitect。javageek。module001。demo01;importorg。assertj。core。util。Lists;importjava。util。List;author极客架构师吴念createTime20221229publicabstractclassBaseTest{ListSKUgeneratorSKU(){SKUsku01newSKU(1L,华为MateBookX,1L,笔记本,10000D,1L,华为旗舰专卖店,1000,1000);SKUsku02newSKU(2L,华为MateBookpro,1L,笔记本,11000D,1L,华为旗舰专卖店,1000,1000);SKUsku03newSKU(3L,华为MateBookD,1L,笔记本,12000D,1L,华为旗舰专卖店,1000,1000);SKUsku04newSKU(4L,HUAWEIMate50,2L,手机,12000D,1L,华为旗舰专卖店,1000,1000);SKUsku05newSKU(5L,HUAWEIMate50PRO,2L,手机,12000D,1L,华为旗舰专卖店,1000,1000);SKUsku06newSKU(6L,HUAWEIMate50E,2L,手机,12000D,1L,华为旗舰专卖店,1000,1000);returnLists。newArrayList(sku01,sku02,sku03,sku04,sku05,sku06);}}
  需求1查询商品分类属于笔记本的商品
  也就是商品的categoryName属性,属性值为笔记本的商品。版本1硬编码SKUService
  这版代码,是需求的最直接的体现,整个方法,入参sourceSkuList中包含的是待查询的商品信息,返回值filteredSkuList集合中,包含了符合查询条件的商品。
  如果商品的CategoryNameequals笔记本,就把它添加到结果集合中。
  很简单吗,但是除了初学者,大家一般不会这么编码,至少大家能想到,这次要查询笔记本,下次可能查询的就是别的了,所以笔记本不能硬编码,应该提取为一个参数。
  这就要看下版代码了。
  测试代码SKUServiceTest
  运行结果
  版本2数据参数化SKUService
  这版代码,比较符合实际工作中的常见编程习惯。把要查询的条件,设置为参数,至少能适应一定的需求变化,但是如果需求查询的不是商品的分类(categoryName),而是别是什么呢,比如价格,我们该如何应对呢。
  测试代码SKUServiceTest
  运行结果
  略需求2查询商品分类属于笔记本,价格大于10000的商品
  这次我们的查询条件有两个,既要是笔记本,又要是价格大于1万。如何实现这个需求呢,对于两个查询条件。我们该如何处理呢,至少可以有两个思路。版本3方案1串行化的多条件过滤SKUService
  这版本代码,是大多数人能想到的解决方案,两个查询条件,就定义两个参数,过滤的时候,两个条件先后执行。在大多数的情况下,这个方案没有太大问题,但是在多核时代下,这种方案的局限性就很明显,因为不论有多少个条件,每个商品,都必须串行的执行所有的查询条件。如果要发挥多核时代,CPU的性能,就需要尝试下面的思路了(注意,这种解决方案,如果非要支持并发执行也不是不可能,只是相对下面的解决方案,不太方便罢了)
  测试代码SKUServiceTest
  版本3方案2并行化的多条件过滤SKUService
  多个查询条件,如果要实现并行化的处理,每个查询条件可以独立进行数据过滤。所以,我们实现了两个数据过滤的方法。
  测试代码SKUServiceTest
  在我们的测试代码中,我并没有真的并行执行这两个查询条件,而是一个执行完之后,再接着执行另外一个,从性能上看,应该还不如方案1,但是它提供了一种可能性,一种并发处理的可能性。我们自己如果要实现并行化的处理,要么直接编写多线程代码,要么使用线程池,代码都简单不了(我在并发编程的系列分享中,会有相关分享)。后面我们要分享的并行化的流操作,会直接帮助我们完成这个工作。
  走出思维死角
  前面我们对于两个需求,三个版本的解决方案,里面都存在一个思维定势,那就是数据参数化,我们要根据商品分类和价格查询商品,我们的参数,传递的就是商品分类的名称和价格这两个参数。我们能不能走出这个思维死角,换个思路呢。
  我们的查询条件是,商品分类的名称是否等于笔记本,价格是否大于1万,前面我们的目光都聚焦在笔记本和1万这些数据上,而忽略了是否等于,是否大于这两个词,它们代表的是动作,是行为。我们能不能更直接一些,把行为参数化呢。
  数据参数化,大家比较好理解,而行为参数化,在面向对象的Java语言中,不太直接,如果我们要传递一个行为(或者说传递一个方法),就只能通过传递对象,来间接的传递方法。
  我们看下面的方案。版本4基于策略模式
  接口及类
  SKUFilterStrategy:商品过滤接口
  CategoryNameFilterStrategy:根据商品分类过滤商品
  PriceGreaterThanFilterStrategy:根据价格过滤商品
  SKUServiceV2:商品过滤服务类
  SKUFilterStrategy接口:商品过滤策略接口,返回值为boolean,表示商品是否符合我们的过滤条件。
  CategoryNameFilterStrategy:商品过滤策略,判断商品分类是否属于笔记本。
  PriceGreaterThanFilterStrategy:商品过滤策略,判断商品价格是否大于1万。
  SKUServiceV2:商品过滤服务类
  filterSKUByStrategy()方法,根据商品过滤策略,对集合中的商品进行过滤。这里使用了策略模式,使得过滤商品的策略,可以无限的扩展,而这个方法,不需要进行任何修改,真正的符合开闭原则,对扩展开放,对修改关闭。
  还有一点,很重要的就是,我们传递的参数SKUFilterStrategyskuFilterStrategy,它是一个对象,而我们在方法中使用的,是这个对象的filter方法。这就是在Java这种面向对象的语言中,需要传递方法(行为)的一种间接的方案,通过传递不同的对象,来实现传递不同的方法。
  有没有更直接的方案呢,我们前面定义的CategoryNameFilterStrategy和PriceGreaterThanFilterStrategy,看起来有些大材小用,或者说有些繁琐。
  能不能更简单一些,在Java8以前,函数式编程还没有出来之前,我们还有一种选择,那就是匿名类了。author极客架构师吴念createTime20221229publicclassSKUServiceV2{privatestaticfinalLoggerLOGLoggerFactory。getLogger(SKUServiceV2。class);publicListSKUfilterSKUByStrategy(ListSKUsourceSkuList,SKUFilterStrategyskuFilterStrategy){ListSKUfilteredSkuListnewArrayList();for(SKUsku:sourceSkuList){if(skuFilterStrategy。filter(sku)){filteredSkuList。add(sku);}}returnfilteredSkuList;}}测试代码
  运行结果
  版本5基于匿名类的策略模式
  这次我们要使用基于匿名类的策略模式,所以只定义了策略接口,策略实现类一个都没有。测试代码
  由于商品的过滤条件,一般都是临时性的,我们专门定义一个类,有些累赘,而直接使用匿名类,则更直接一些。
  但是,大家有没有发现,即使使用了匿名类,代码好像也没简化多少,只不过少了个类名罢了。能不能更简单一些,下面我们的主角就要上场了。
  运行结果
  版本6基于Lambda表达式的策略模式
  这次我们要使用Java函数式编程中的lambda表达式,来实现策略模式,策略接口也是不能少的,策略实现类当然,也不需要。测试代码
  我们的主角登场了,使用了Lambda表达式,代码精简了不少,所有的官样代码都没有了。而且最为重要的一点,就是我们实现了真正的行为参数化,我们在参数中,直接传递的就是方法中的代码片段。而没有传递对象。这就是函数式编程的一个重要特点。那么这里的代码,为什么要这么写,语法是什么样的,还可以怎么写,这就是我们下一期要详细讲解的内容了。
  运行结果
  下期预告
  本期我们从数据参数化到行为参数化,从普通的策略模式,到匿名类的策略模式,再到基于Lambda表达式的策略模式,带领大家走进了Java函数式编程的大门,下期,我们就详细的聊聊Lambda表达式的语法规则,应用技巧以及它的底层原理。参考书籍
  《Java8inAction》
  《OnJava8》

世界上的路有千万条,总有一条属于自己的路1见过花开,便会更懂得风的温柔,心若向阳,便也更懂得阳光的温暖。2后来你会发现,和温柔的人在一起是养生,和有趣的人在一起是养心,和聪明的人在一起是养脑。3乞讨和上班的区别乞讨,哎行法国梧桐银杏和枫叶里的南京,才是金陵一入秋,南京便美成了金陵。法国梧桐银杏和红叶组成了南京深秋的三大秋日色彩代表。法国梧桐已然成为南京的城市名片。和民国历史建筑相辅相成,也承载着浪漫的故事,见证着民国历史沉浮。偷懒的深秋寒露丰收季,4类水果适合秋季食用随着气温逐渐降低,二十四节气已经不知不觉到了寒露时节。这时大雁南飞,北方的禽类渐渐减少了活动频率,而各种各样的菊花开始相继开放。秋季是丰收的季节,农谚有云黄烟花生也该收,起捕成鱼采一年补透,不如深秋补够!霜降后,多喝5道营养汤,健康入冬导语一年补透,不如深秋补够!霜降后,多喝5道营养汤,健康入冬霜降之后,天气有了明显的变化,越来越冷,也越来越干燥了,那么在还未入冬的这段时间内,我们要多注意一些,别穿得太少受凉了,蒲城县红提葡萄成熟上市金秋好丰景近期,在陕西省渭南市蒲城县尧山镇太睦村,4000余亩红提葡萄成熟上市,迎来采摘销售季。硕果累累走进蒲城县尧山镇太睦村,一串串红提葡萄挂在枝头,令人垂涎欲滴。葡萄园里,忙着采摘的果农43岁伏明霞近况与70岁富豪老公很恩爱,坦言自己是嫁给爱情俗话说,一入豪门深似海。这样的生活是我们远远无法能够触及的,但不少运动选手都一跃嫁入了豪门,成为了豪太太。但并不是每个人的命都是那样子的好,嫁入豪门就能够拥有幸福的生活。据媒体爆料花2790元买的大牌羽绒服里没有一根羽绒,客服却说很保暖?公司回应三倍赔偿老婆饼里没有老婆,菠萝包里没有菠萝。现在居然羽绒服里都没有羽绒了?近日,北京的李先生花两千多元买了一件知名品牌法国鳄鱼LACOSTE的羽绒服,可是收到货后,却发现衣服里没有任何羽绒生生世世只求一双人,海枯石烂的誓言早就说腻了为爱誓言,只求一生一世一双人,甜甜的爱恋,当然是从结婚开始了,为爱一诺千年作者侍心走云简介君天涯,我海角,只要你在,我便在。时空阻不断你我的爱。为爱,一诺千年为爱,千山万水一路走过衢州美丽河湖秋水共长天一色一切美好的事物都值得等待,这一季的秋景同样如此,当所有人都在感慨,过山车式的气温把秋天弄丢了,不期然间,浙江衢州美丽河湖的秋如约而至,是秋色连波,波上寒烟翠,亦是湖光秋月两相和,在笑口常开,好运连连每天开开心心,好运跟着你。笑对生活,生活也会回报你的微笑。记得常常微笑露齿大笑,你的笑容真美。我们都要把日子过得有滋有味,珍惜每一个美好的今天每一个当下,用好心情去迎接它。美丽的好多保重,笑口常开秋凉了,多保重身体。早晚记得添加衣服,健康快乐,笑口常开。平安是世间最美好的祝福,愿你平平安安,健健康康,吉祥如意!每天的日子虽然平凡普通,却又是珍贵的每一天。珍惜属于我们的每一个
辽宁天下第一名胜古迹,你知道几个?这4个您或多或少听过我们经常说东北三省,但对于黑吉辽的了解,很多人都停留在口头上。只知道他曾经是重工业发达的地方,有肥沃的黑土地,豪爽的饮食文化和豪迈的东北人。但其实东北也有很多风景名胜,哈尔滨冰雕世浅谈国共第一次合作的原因作者舒心阁主,70后历史教师,希望在舒心阁和大家谈天说地论古今,舒心快乐又一天。欢迎大家阅读点赞转发,请加关注哟。关于国共第一次合作,高中历史人教版一笔带过,语焉不详。学生对此懵懵100万美元天价年薪,为何篮协还愿意铤而走险,赛前换帅接手男篮爆中国男篮新主帅乔尔杰维奇年薪高达100万美元,合计700万元人民币,这是本土教练的多少倍啊?那么为什么篮协还是愿意赛前换帅,铤而走险花费天价去聘请洋帅执教呢?是因为成绩不行吗?还33人缺阵两队多达7人!伤病潮来得这么早球员全成玻璃人?11月20日,NBA东西部联盟总共5场比赛,爵士开拓者,费城森林狼等捉对儿厮杀,这不是重点,重点是,5场比赛居然多达33人缺阵,费城5人伤停,魔术7人伤停,猛龙7人伤停!赛季进行不国际足联官宣开幕式提前一小时举行众多中国元素将亮相半小时演出20日晚,国际足联官方宣布,即将开幕的2022年卡塔尔世界杯开幕式将提前1个小时进行,开始时间从北京时间23点30分提前到22点30分。而在开幕式上,众多中国元素也将亮相其中。此前好家伙!76人将托拜亚斯哈里斯摆上货架再见费城!76人离队第一人诞生,他终将成为球队冲冠的牺牲品!毫无疑问,今年休赛期詹姆斯哈登之所以会主动降薪留守费城76人,他为的就是继续搭档大帝恩比德冲击总冠军!而76人这两年也在宇宙最大天体有多大?把人类平均分布上去,你永远无法遇到另一人就宇宙中的天体而言,卫星绕着行星转,行星绕着恒星转,它们三者的体积通常是卫星小于行星,行星又小于恒星。比如月球地球和太阳三者之间的关系,月球的半径约为1737。1千米,地球的半径约中国打造的人造月亮,可以照亮夜空,它会给人类文明带来什么?人类诞生于数百万年前,是地球的霸主。人类的诞生让地球由生命星球升级为文明星球,同时人类依靠自己的智慧也在不断改变着生活,改变着这个世界。当人类在数百年前开始走进科技发展的道路之后,30个有趣的发现带你探索神秘的深海虽然海洋离我们很近,但我们对海洋的了解甚至不如对月球的了解。大洋深处有很多我们达到不了的地方,下面这些有趣的发现会让你对深海产生敬畏之心。这种巨型旗鱼是海洋的霸主鳗鱼像吃意大利面一马斯克能修复哈勃吗?哈勃能修好吗?在太空中度过了32年之后,哈勃望远镜早就应该成为太空垃圾了,但情况并非如此。望远镜继续向地球传送令人惊叹的图像,收集了大量的科学数据。是时候修好哈勃了!最近一次是在十你和高手的差距,就在于处理问题的能力见识的高度,决定做事的高度人的一生,是一个不断见天地见众生见自我的过程。走出方寸之地,丰富自己的见识,才能不断提升自己。遇到问题时,高手懂得化敌为友,而不是反目成仇。互相对峙只会两
友情链接:快好找快生活快百科快传网中准网文好找聚热点快软网