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

effectivejava3lambda和stream44坚

  在Java具有Lambda表达式之后,编写API的最佳实践也做了相应的改变。例如在模板方法(TmplateMethod)模式〔Gamma95〕中,用一个子类覆盖基本类型方法(primitivemethod),来限定其超类的行为,这是最不讨人喜欢的。现在的替代方法是提供一个接受函数对象的静态工厂或者构造器,便可达到同样的效果。在大多数情况下,需要编写更多的构造器和方法,以函数对象作为参数。需要非常谨慎地选择正确的函数参数类型。
  以LinkedHashMap为例。每当有新的键添加到映射中时,put就会调用其受保护的removeEldestEntry方法。如果覆盖该方法,便可以用这个类作为缓存。当该方法返回true,映射就会删除最早传入方法的条目。下列覆盖代码允许映射增长到100个条目,然后每添加一个新的键,就会删除最早的那个条目,始终保持最新的100个条目:protectedbooleanremoveEldestEntry(Map。EntryString,Objecteldest){returnsize()100;}
  这个方法很好用,但是用Lambda可以完成得更漂亮。假如现在编写LinkedHashMap,它会有一个带函数对象的静态工厂或者构造器。看一下removeEldestEntry的声明,你可能会以为该函数对象应该带一个Map。EntryK,V,并且返回一个boolean,但实际并非如此:removeEldestEntry会调用size(),获取映射中的条目数量,这是因为removeEldestEntry是映射中的一个实例方法。传到构造器中的函数对象则不是映射中的实例方法,无法捕捉到,因为调用其工厂或者构造器时,这个映射还不存在。所以,映射必须将它自身传给函数对象,因此必须传入映射及其最早的条目作为remove方法的参数。声明一个这样的函数接口的代码如下:Unnecessaryfunctionalinterface;useastandardoneinsteadFunctionalInterfacepublicinterfaceEldestEntryRemovalFunctionK,V{booleanremove(MapK,Vmap,Map。EntryK,Veldest);}
  这个接口可以正常工作,但是不应该使用,因为没必要为此声明。java。util。function包已经为此提供了大量标准的函数接口。只要标准的函数接口能够满足需求,通常应该优先考虑,而不是专门再构建一个新的函数接口。这样会使API更加容易学习,通常减少它的概念内容,显著提升互操作性优势,因为许多标准的函数接口都提供了有用的默认方法。如Predicate接口提供了合并断言的方法。对于上述LinkedHashMap范例,应该优先使用标准的BiPredicateMapK,V,Map。EntryK,V接口,而不是定制EldestEntryRemovalFunction接口。
  java。util。function中共有43个接口。别指望能够全部记住它们,但是如果能记住其中6个基础接口,必要时就可以推断出其余接口了。基础接口作用域对象引用类型。Operator接口代表其结果与参数类型一致的函数。Predicate接口代表带有一个参数的并返回一个boolean的函数。Function接口代表其参数与返回的类型不一致的函数。Supplier接口代表没有参数并且返回(或提供)一个值的函数。最后,Consumer代表的是带有一个函数但不返回任何值的函数,相当于消费掉了其参数。这6个基础函数表述如下
  这6个基础接口各自还有3种变体,分别可以作用于基本类型int、long、double。它们的命名方式是在其基础接口前面加上基本类型。因此,以带有int的predicate接口为例,其变体名称应该是IntPredicate。这些变体接口的类型都不是参数化的,除了Function变体外,后者是以返回类型为参数。例如,LongFunctionint〔〕表示带有一个long参数,并返回一个int〔〕数组。
  Function接口还有9种变体,用于结果类型为基本类型的情况。源类型和结果类型始终不一样,因为从类型到自身的函数就是UnaryOperator。如果源类型和结果类型均为基本类型,就是在Function前面添加格式如SrcToResult如LongToIntFunction(有6种变体)。如果源类型为基本类型,结果类型是一个对象参数,则要在Function前面添加ToObj,如DoubleToObjFunction(3种变体)。
  这3种基础函数接口还有带两个参数的版本,如BiPredicateT,U、BiFunctionT,U,R和BiConsumerT,U。还有BiFunction变体用于返回三个相关的基本类型:ToIntBiFunctionT,U,ToLongBiFunctionT,U和ToDoubleBiFunctionT,U。Consumer接口也有带两个参数的变体版本,他们带一个对象引用和一个基本类型ObjDoubleConsumer,ObjIntConsumer,ObjLongConsumer。总之,这些基础接口有9个带两个参数的版本。
  最后,还有BooleanSupplier接口,它是Supplier接口的一种变体,返回boolean值。这是在所有的标准函数接口名称中唯一显式提到boolean类型的,但boolean返回值是通过Predicate及其4种变体来支持的。BooleanSupplier接口和上述提到的42个接口,总计43个标准函数接口。显然,这是个大数字,但是他们之间并非纵横交错。另一方面,你需要的接口函数都替你写好了,它们的名称都是循规蹈矩的,需要的时候并不难找到。
  现有的大多数标准函数接口都只支持基本类型。千万不要用带包装类型的基础函数接口来代替函数接口。虽然可行,但它破坏了第61条的规则基本类型优于装箱基本类型。使用装箱基本类型进行批量操作处理,最终会导致致命的性能问题。
  现在知道了,通常应该优先使用标准的函数接口,而不是用自己编写的接口。但什么时候一听该自己编写接口呢?当然是在如果没有任何标准的函数接口能满足你的需求之时,如果需要一个带有3个参数的Predicate接口,或者需要一个抛出受检异常的接口时,当然就需要自己编写啦。但是也有这样的情况:有结构相同的标准函数接口可用,却还是应该自己编写函数接口。
  还是以咱们的老朋友Comparator为例。它与ToIntBiFunctionT,T接口在结构上一致,虽然前者被添加到类库中时,后一个接口已经存在,但如果用后者就错了。COmparator之所以需要自己的接口,有3个原因。首先,每当在API中使用时,其名称提供了良好的文档信息,并且被大量使用。其次,Comparator接口对于如何构成一个有效的实例,有着严格的条件限制,这构成了它的总则(genneralcontracat)。实现该接口相当于承诺遵守其契约。第三,这个接口配置了大量很好用的缺省方法,可以对比较器进行转换和合并。
  如果你所需要的函数接口与Comparator一样具有一项或者多项以下特征,则必须认真考虑自己编写专用的函数接口,而不是使用标准的函数接口:通用,并且将受益于描述性的名称。具有与其关联的严格的契约将受益于定制的缺省方法
  如果决定自己编写函数接口,一定要记住,它是一个接口,因而设计时应当万分谨慎(详见第21条)。
  注意,EldestEntryRemovalFunction接口是用FunctionalInterface注解进行标注的。这个注解类型本质上与Override类似。这是一个标注了程序员设计意图的语句,它有3个目的:告诉这个类及其文档的读者,这个接口是针对Lambda设计的;这个接口不会进行编译,除非它只有一个抽象方法;避免后续维护人员不小心给该接口添加抽象方法。必须始终用FunctionalInterface注解对自己编写的函数接口进行标注。
  最后一点是关于函数接口在API中的使用。不要在相同的参数位置,提供不同的函数接口来进行多次重载的方法,否则可能在客户端导致歧义。这不仅仅是理论上的问题。比如ExecutorService的submit方法就可能带有Callable或者Runnable,并且还可以编写一个客户端程序,要求进行一次转换,以显示正确的重载(详见第52条)。避免这个问题的最简单方式是,不要编写在同一个参数位置使用不同函数接口的重载。这是该建议的一个特例,详情见52条。
  总而言之,既然Java有了Lambda,就必须时刻谨记用Lambda来设计API。输入时接受函数接口类型,并在输出时返回之。一般来说,最好使用java。util。function。Function中提供的标准接口,但是必须警惕在相对罕见的几种情况下,最好还是自己编写专用的函数接口。

三国杀大宝强无敌?这几个武将可以随便犯大吴疆土众所周知,三国杀当中各个时期都有代表的人气武将,从之前的孙笨那个男人孙策到无处不在的吴懿,再到棘手怀念摧毁的马超马神,到现在的阳光男孩大宝界徐盛,每个武将都非常有梗。而我们如今的人农村喝了几十年的散酒,为啥以前没事,现在很多专家却说不能喝?农村喝了几十年的散酒,为啥以前没事,现在很多专家却说不能喝?专家说的话,从神话到废话,到了如今很多却成了笑话。散装酒,作为一种销售形式和形态,可以说流传了千百年的时间,只不过古代喝陈昌浩建国后默默无闻,妻子成副部长,儿子是受国人敬仰的大人物说起红军时期的三大主力,大家觉得最能打的哪一支,想必每个人心中的答案都不一样。不过我认为最能打的是红四方面军。红四方面军巅峰时期的战斗力,甚至超过了中央红军。说起红四方面军,有个人家里若有三种老人帮忙带娃,宝宝聪明有教养,父母可以放心托付邻居阿姨和姨夫去儿子的城市已经4年多了,其实老人都故土难离,但是邻居家儿子和儿媳妇都忙于上班,结婚生完子之后,他们老两口理所当然过去帮忙照顾孙子了。现在的家庭多数都是这种模式,年轻孩子的话要认真听二岁十个月的豆豆,闹情绪是家常便饭,为娘的我从来不当回事儿,多数时候会当成无理取闹而忽视了。昨天,豆豆傍晚从幼儿园回来,又开始闹情绪,要骑高新老王的电动车出去玩,但是把他从车上放下原神内购即将涨价,国区暂不受影响近日原神官方在HOYOLAB社区发布公告,表示为了应对平台价格政策影响,游戏中的内购价格将会进行一定程度上的上调,受影响的区域包括智利,印度,日本,马来西亚,巴基斯坦,波兰,韩国,lpl赛程分析lpl已经开始了第一天除了EDG意外都胜了,挺意外的!jdg赢了感觉正常,EDG输了也可以接受毕竟skt实力也不差,RNG赢了真没想到,毕竟入围赛打的没有那么理想,可能这就是血脉压KPL选手FMVP统计向阳为游走正名,发育路谁能破荒?新京报讯(记者赵雪)在10月6日晚结束的王者荣耀挑战者杯总决赛中,来自武汉eStarPro的向阳(ID子阳)当选总决赛MVP,成为王者荣耀职业赛事中首位获此殊荣的游走位选手。新京报魔兽世界资料片末期休闲玩法,地图中可蹲的坐骑还是很多的魔兽世界暗影国度资料片马上就要结束了,这个资料片陪伴了我们大概有两年的时间。我们在暗影界的旅程马上就要结束了。接下来就要进入巨龙时代资料片,这个资料片是在11月29日同步上线,到时敬佩!罗伊琼斯出资帮助低迷的中国职业拳击,为国内拳手延续梦想2022年已走过大半,中国职业拳击再次经历了十分难熬的一年,日前徐灿输给墨西哥新星贝尼特斯的一战让人们开始重新审视中国职业拳击的未来该何去何从,相信国内的广大从业者也在考虑这个问题32击败12冠王!日本夺亚洲第4冠跳舞庆祝,中国男足放弃参赛北京时间10月9日,亚洲室内足球锦标赛落下帷幕,决赛中日本队32击败了伊朗队,第四次拿下了亚洲冠军。赛后,日本球员相当兴奋。本次比赛,中国队选择放弃比赛。室内足球的亚洲霸主是伊朗队
在汕头,有什么美食推荐吗?汕头的肠粉跟普宁肠粉广州肠粉都有区别。分辨汕头肠粉,要从蒸炉馅肠粉皮配料去看。汕头肠粉的皮比较薄,酱料为卤汤,用酱油和其他佐料调制,正宗的一般不会太咸。而普宁肠粉的酱料是淡黄色,跟用户期盼的携号转网,现在为什么会遇冷?携转后的一些功能性影响先不说,到底携号转网的需求有多大呢,或者说到底哪些人需要携转,他们携转的动机又是什么呢?首先说说大背景。第一个是自从取消漫游,全国通话,流量统一后,确实方便了你在LOL游戏中获得最高的评分是多少?16。6的评分是最高的吗?LOL游戏TGP评分是对你在整局游戏当中所为团队做出贡献度的评判,英雄联盟是五个人的游戏都是为了游戏胜利而战,但每个人所谓团队的贡献程度不一样,贡献程度越高的评分越高,也就是我们经养老金差距大,有人建议6000以上停涨,2000以下多涨,是否可行?如果这样的话就等于直接破坏的社保多交多得长交多得的缴费制度,没有制度保障的社保能运行吗?没有社保了大家去那里领养老金?这种提问就是明目张胆的破坏依法建立的社保制度!6000以上停涨多少人认为手机游戏对青少年的危害大?多少人支持禁止孩子玩手机游戏,为什么?孩子玩手机,有害无益,应一刀切全面禁止。理由如下手机幅射对身体的危害,人类还在不断地发现中。手机给人的依赖性,小孩无法把控。手机影响了小孩的基础教育和想象力。总之,小孩一直到中学阶教育爱玩游戏的孩子,逼迫他减少玩游戏的时间可以吗?作为一名网络游戏行业从业人员,我可以告诉大家,游戏产品制作的努力方向就是防不沉迷,所有游戏产品的最重要指标就是各种渠道进入游戏用户的长期留存率,同时对于部分游戏来说,在线时长也是重DNF属强在95版本很重要,怎么堆才能做到不错过任何细节呢?提升伤害的细节有属强,三攻和力智,其中属强的提升是在所有属性中提升最大的,同时也是最难堆的一种,如何在95版本不错过任何堆属强的细节,那么只有一个办法,那就是氪金。可以提升属强的方还有哪些堪比权力的游戏的电视剧?权力的游戏画面精致尺度大杀戮暴力刺激惊险。类似这样的美剧还真不少,这里推荐几部与其同名的巅峰剧作。精彩剧集,千万不要错过!第一部都铎王朝这部都铎王朝听名字就有一股糜烂的腐败气息扑面小米手机的缺点是什么?总的来说,小米是为发烧而生的,所以在配置党看来,当然是无可挑剔的啦!但是,也是有点小瑕疵的手机硬件问题有点大,包括主板及通话功能差,有回声!拍照也是比较弱势的,相对其他主流国产而言儿子今年6岁上课不认真听课,不自律,老师建议再上一年大班,家长怎样才能教育好孩子?六岁小学生才从幼儿期进入儿童期,身上必然会有很多不良习惯需要家长重新培养。一般有经验的家长,都会在孩子进入小学前,进行至少半年以上的幼小衔接准备工作,就是为了培养孩子具备良好的生活为什么不建议给宝宝买寿险?我不认为不需要为宝宝买寿险,只是市场上没有太合适的产品。为什么宝宝也需要寿险?行业一致的观点认为,宝宝是纯消费者是不创造价值的,如果不幸身故对家庭的财务造成不了影响。这个观点没问题
友情链接:快好找快生活快百科快传网中准网文好找聚热点快软网