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

你不知道的GuavaCollect,都在这了

  集合操作是编程中使用频率非常高的,所有有一款针对集合的操作工具是非常有必要的。通过框架提供的工具一方面可以减少开发相似功能的耗时;同时框架在安全与稳定性上更被推荐。
  GuavaCollect是Guava工具包中的一个子模块,主要对jdk中的集合操作添加了一些简易的API,同时也是对Collections工具类的扩展。当然Guava还定义了一些特定场景的数据结构以及一些针对jdk集合的优化,最典型的就是ImmutableCollections(不可变集合),你会发现调用GuavaAPI很多都是不可变的意义
  我们常见的集合类有:ListSetVectorStackMapQueue
  集合是一种非常常见的数据结构,JDK在处理各种数据集时,提供了以上集合类型的数据结构以及其对应API方便开发者高效简易地对数据对象操作特色
  guava主要提供了以下几个方面的支持:增加了不可变集合不受信任的库可以安全使用。线程安全:可以被许多线程使用,没有竞争条件的风险。不需要支持突变,并且可以通过该假设节省时间和空间。所有不可变集合实现都比它们的可变兄弟更节省内存。(分析)可以用作常数,期望它保持不变。增加了新的集合类型Multiset与普通的Set相比,提供了元素出现频率的记录。可用于元素出现次数的记录Multimap一个与Map相比,一个建可以对应对应多个值。与Spring中MultiValueMap一样BiMap键值都是唯一的MapTable具有行、列的表格,数据视图中可能更直观。ClassToInstanceMap键为Class,值为Class实例的特殊MapRangeSet代表一组数据区间,类似数学中的〔1,9)RangeMap与RangeSet类似,不过将其区间作为建,可以有自己的值。〔1,9)VAL优化了常用的操作集合的创建
  ImmutableSet。of(elem。。。)
  Lists。newArrayList(elem。。。)
  Sets。newHashSet(elem。。。)
  Maps。newHashMap()
  。。。常用的操作判断两个集合是否相等:Iterables。elementsEqual()
  集合分段处理:Lists。partition()
  取集合的交集:Sets。intersection()
  取集合的差集:Sets。difference()
  。。。使用
  GuavaCollect作为集合操作工具,我们主要从实际业务中了解其能够帮助我们实现怎样的需求,下面看下其API的使用情况:
  假设我们有10000名学生,通过Faker生成这些模拟的学生数据数据:ListStudentstudentsnewArrayList();FakerfakernewFaker(Locale。CHINA);Beforepublicvoidinit(){FakerenFakernewFaker();Namenamefaker。name();IntStream。range(0,10000)。forEach(index{students。add(Student。of()。setId(String。valueOf(index1))。setName(name。name())。setAge(faker。number()。numberBetween(18,22))。setGender(newString〔〕{男,女}〔faker。number()。numberBetween(0,2)〕)。setAddress(faker。address()。streetAddress())。setScore(faker。number()。randomDouble(3,50,100))。setEmail(faker。internet()。emailAddress(enFaker。name()。username()))。setTelephone(faker。phoneNumber()。cellPhone()));});}
  Multiset
  获取元素出现频次。比如获取男生与女生的学生数量分别为多少Testpublicvoidmultiset(){MultisetmultisetHashMultiset。create();students。forEach(student{if(Objects。equals(student。getGender(),男)){multiset。add(男);}else{multiset。add(女);}});System。out。println(学生中男生数量:multiset。count(男));System。out。println(学生中女生数量:multiset。count(女));}
  Multimap
  一个键对应多个值时。比如查看各个年龄的学生是哪些Testpublicvoidmultimap(){ListMultimapInteger,StudentmultimapMultimapBuilder。hashKeys()。arrayListValues()。build();students。forEach(student{multimap。put(student。getAge(),student);});System。out。println(multimap。get(20));}
  BiMap
  键和值都是唯一时。比如处理学生的邮箱和手机号,客户互换键值位置TestpublicvoidbiMap(){BiMapbiMapHashBiMap。create();students。forEach(student{biMap。put(student。getEmail(),student。getTelephone());});BiMapinversebiMap。inverse();键值更换System。out。println(biMap);System。out。println(inverse);}
  Table
  二维表,通过行(键)、列(键)取值比如可以以学生为行数据,其中id为行键,列名分别为学生属性名称
  ID姓名年龄性别1TOM22男Testpublicvoidtable(){TableString,String,ObjectweightedGraphHashBasedTable。create();students。forEach(student{weightedGraph。put(student。getId(),姓名,student。getName());weightedGraph。put(student。getId(),年龄,student。getAge());weightedGraph。put(student。getId(),性别,student。getGender());weightedGraph。put(student。getId(),邮箱,student。getEmail());weightedGraph。put(student。getId(),电话,student。getTelephone());weightedGraph。put(student。getId(),地址,student。getAddress());weightedGraph。put(student。getId(),分数,student。getScore());});MapString,ObjectrowweightedGraph。row(1);MapString,ObjectcolumnweightedGraph。column(姓名);SetTable。CellString,String,ObjectcellsweightedGraph。cellSet();System。out。println(row);System。out。println(column);System。out。println(cells);}
  ClassToInstanceMap
  当值是键的类型实例时,通过该Map现在键值关系TestpublicvoidclassToInstanceMap(){ClassToInstanceMapNumbernumberDefaultsMutableClassToInstanceMap。create();numberDefaults。put(Number。class,1);MapClass,ObjectobjectMapnewHashMap();objectMap。put(Number。class,2);}
  RangeSet
  区间Set。比如通过学生分数确定学生等级TestpublicvoidrangeSet(){RangeSetDoubleArangeSetTreeRangeSet。create();ArangeSet。add(Range。closed(90d,100d));〔90,100〕RangeSetDoubleBrangeSetTreeRangeSet。create();BrangeSet。add(Range。closedOpen(80d,90d));〔80,90)RangeSetDoubleCrangeSetTreeRangeSet。create();CrangeSet。add(Range。closedOpen(70d,80d));〔70,80)RangeSetDoubleDrangeSetTreeRangeSet。create();DrangeSet。add(Range。closedOpen(60d,70d));〔60,70)RangeSetDoubleErangeSetTreeRangeSet。create();ErangeSet。add(Range。lessThan(60d));〔。。。,60)students。forEach(student{System。out。print(学生:student。getName());System。out。print(,分数为:student。getScore());Stringrank;if(ArangeSet。contains(student。getScore())){rankA;}elseif(BrangeSet。contains(student。getScore())){rankB;}elseif(CrangeSet。contains(student。getScore())){rankC;}elseif(DrangeSet。contains(student。getScore())){rankD;}elseif(ErangeSet。contains(student。getScore())){rankE;}System。out。print(,等级为:rank);});}
  RangeMap和RangeSet类似,区别是添加了区间命名。和上面一样TestpublicvoidrangeMap(){RangeMapDouble,StringrangeMapTreeRangeMap。create();rangeMap。put(Range。closed(90d,100d),A);〔90,100〕rangeMap。put(Range。closedOpen(80d,90d),B);〔80,90)rangeMap。put(Range。closedOpen(70d,80d),C);〔70,80)rangeMap。put(Range。closedOpen(60d,70d),D);〔60,70)rangeMap。put(Range。lessThan(60d),E);〔。。。,60)students。forEach(student{System。out。print(学生:student。getName());System。out。print(,分数为:student。getScore());System。out。print(,等级为:rangeMap。get(student。getScore()));});}下面看下对常用集合的一些操作
  当然我们首先需要将数据使用GuavaCollect对应的数据结构来存储数据,这样才能使用其对应的API:集合创建FluentIterable。of(elem。。。)
  Lists。newArrayList(elem。。。)
  Sets。newHashSet(elem。。。)
  Maps。newHashMap()
  HashMultiset。create()
  ArrayListMultimap。create()
  Tables。newCustomTable(Maps。newLinkedHashMap(),()Maps。newLinkedHashMap())条件过滤
  FluentIterable。filter(predicate);FluentIterable。anyMatch(predicate);FluentIterable。allMatch(predicate);FluentIterable。firstMatch(predicate);拆分Iterables。partition(list,pageSize);拆解集合计算Iterables。frequency(list,elem);元素出现的次数集合的并集、交集、差集并集Sets。union(set1,set2);交集Sets。intersection(set1,set2);差集set1为参考Sets。difference(set1,set2);并集交集Sets。symmetricDifference(set1,set2);同上Sets。difference(Sets。union(set1,set2),Sets。intersection(set1,set2));笛卡尔积Sets。cartesianProduct(Arrays。asList(Sets。newHashSet(1,2,3),Sets。newHashSet(3,4,5,6));Map,KV相同的部分difference。entriesInCommon();同K不同Vdifference。entriesDiffering();左边存在的右边不存的Kdifference。entriesOnlyOnLeft();右边存在的左边不存的Kdifference。entriesOnlyOnRight();索引将元素中的子项作为索引,由于元素检索Maps。uniqueIndex()Multimaps。index()Jdk中的集合操作
  自从Jdk中引入了集合Stream的操作后,从很大程度上简化了对集合的操作,以前大量代码现在可能简单几行就能够达到相同的效果,同时支持并发处理,一并提升了效率。
  下面看下常见的集合基于stream操作,同样以上面的学生为例:
  遍历forEachTestpublicvoidforEach(){students。stream()。forEach(System。out::println);}
  转换map
  将元素转换成其他类型。比如根据学生名称、性别组成新的List;以id为键元素为值的Map或者学生姓名拼接的字符串等等Testpublicvoidtransform(){转换为数组ListStringlistResultstudents。stream()。map((val)val。getName():val。getGender())。collect(Collectors。toList());System。out。println(listResult);转换成StringStringstringResultstudents。stream()。map(Student::getName)。collect(Collectors。joining());System。out。println(stringResult);转换成MapMapString,StudentmapResultstudents。stream()。collect(key,value,mergerOperation,initializationCollectors。toMap(Student::getName,Student::self,(v1,v2){出现相同key时的合并规则returnnull;},HashMap::new));System。out。println(mapResult);}
  过滤filter
  根据条件匹配满足要求的元素。如找出分数大于80分的学生Testpublicvoidfilter(){ListStudentfilterResultstudents。stream()。filter((val){returnval。getScore()80;})。collect(Collectors。toList());System。out。println(filterResult);}
  拆解flatMap
  将二层级集合进行拆解,并成一级集合。如〔〔1,2,3〕,〔4,5,6〕〕〔1,2,3,4,5,6〕TestpublicvoidflatMap(){复合拆解ListIntegerresultStream。of(Arrays。asList(1,2,3),Arrays。asList(4,5,6))。flatMap(subListsubList。stream())。collect(Collectors。toList());System。out。println(result);123456}
  计算实现数据的汇总、求平均值、最大值。。。,当然主要针对数字(Number)类型Testpublicvoidcalculate(){求和doublesumstudents。stream()。mapToDouble(Student::getScore)。sum();最大值doublemaxstudents。stream()。mapToDouble(Student::getScore)。max()。getAsDouble();最小值doubleminstudents。stream()。mapToDouble(Student::getScore)。min()。getAsDouble();平均值doubleavgstudents。stream()。mapToDouble(Student::getScore)。average()。getAsDouble();归约运算fold。count、sum、min、max、averageDoubleSummaryStatisticsdoubleSummaryStatisticsstudents。stream()。mapToDouble(Student::getScore)。summaryStatistics();}
  归纳计算reduce
  在很多语言中都存在的函数,如python、javascript。数据的累加、map的功能Testpublicvoidreduce(){结果和identity(初始值)类型相同identityaccumulatorcombinerMapresultstudents。stream()。reduce(newHashMapString,Student(),初始值(map,student){map。put(student。getId(),student);returnmap;},(map1,map2){并发执行时的map合并returnnull;});}
  并发parallel
  上面的操作我们还可以使用parallel对stream并发处理Arrays。asList()。stream()。parallel()。。。;Arrays。asList()。parallelStream()。。。;
  分段处理对集合按固定规格分段处理,处理大批量数据时,结合parallel实现分段并发处理来提示效率Testpublicvoidpartition(){ListStringlistnewArrayList();intpartition100;每段100个元素intpartlist。size()partition(list。size()partition0?0:1);Stream。iterate(0,nn1)。limit(part)。parallel()并发。map(indexlist。stream()。skip(indexpartition)。limit(partition)。parallel()。collect(Collectors。toList()))。forEach(System。out::println);}总结
  本章主要介绍了GuavaCollect部分,以及对集合操作的常用API,通过示例可以看到有其对JDK集合的扩展有了更广泛与简易的操作。同时在JDK引入了Stream操作后,GuavaCollect中的很多功能通过Stream也可以比较容易的实现了,当然具体如何选择根据实际情况。需要注意的是GuavaCollect中返回的基本都是不可变的集合,这样在对数据的操作会更加的安全。

深度分析大幅降价的iPhone14Plus值得入手吗?众所周知,iPhone14Plus在10月7日迎来了正式开售,作为苹果第一款标准版大屏新机,Plus取代了原先的mini机型,苹果希望iPhone14Plus能带来更好的销量表现,黑田东彦拒辞职日元贬值何时休毕振山担任日本银行(央行)行长已达9年的黑田东彦,近日再次面临辞职压力。10月18日,在日本众议院预算委员会会议上,有在野党议员以日元持续贬值为由,要求黑田立即辞职。黑田回应称,量企业缴纳社保15年和个人缴纳社保15年,退休金会有什么差距吗?企业缴纳社保15年和个人缴纳社保15年,退休的时候哪一种方式的养老金更高,哪一种方式缴纳更加划算?企业缴纳社保和个人缴纳社保,缴费方式有哪些差异?一般来说企业缴纳社保15年和个人缴A股十大流通股东总市值统计TOP100,截止至2021311香港中央结算(代理人)有限公司31917亿2香港中央结算有限公司26354亿3中央汇金投资有限责任公司23412亿4中国贵州茅台酒厂(集团)有限责任公司13777亿5HKSCCN元宇宙豫你在一起丨布局元宇宙,河南底气与优势在哪里?河南省元宇宙科创产业园设计图策划大河报时政新闻中心执行大河报豫视频记者侯冰玉陈朋冲文受访者供图日前,在河南省第六期三个一批项目建设活动举办之时,河南省元宇宙科创产业园举行奠基仪式,抖音电商范围再扩大,连也开始卖货了要论现在能挣钱和最火的行业有哪些,那正处于黄金时期的电商行业必须榜上有名。尤其是受疫情影响,电商行业发展的越来越快,在见证了电商行业的爆火之后,各大公司企业以及中小微企业都纷纷涌入多车企不达标!新能源车企前三季销量榜公布2022年前三季度新能源车销量数据出炉。乘联会数据显示,2022年19月,国内新能源乘用车零售销量为387。7万辆,同比增长113。2,远超去年全年销量,其中比亚迪自4月全面放弃燃伤亡30多万,可连续四任总统都要打越南战争,美国想得到什么?越南战争是美国近代以来持续时间最长的一场战争,造成的影响巨大且极其恶劣,作为战场的越南,有超过160万人死亡,更有1000多万人流离失所,其他财物什么的就别提说了,整个国家几乎被打隔夜美股全球资产定价之锚续创14年来最高水平三大指数集体收跌智通财经APP获悉,在美联储官员的鹰派表态加持下,全球资产定价之锚10年期美债收益率继续刷新2008年来高位,美股周四再度承压,三大指数昨日未能实现反弹。三大美股指数昨日集体低开,出乎意料,荷兰光刻机巨头ASML突然表态据彭博社20日报道,荷兰光刻机生产企业阿斯麦(ASML)周三向投资者保证,美国限制中国获取尖端半导体技术的最新出口管制措施,对该公司的影响相当有限。ASML的言论让市场感到出乎意料人民币汇率不具备持续贬值基础汇率稳定有坚实保障本周以来,离岸人民币对美元汇率持续下跌。Wind数据显示,北京时间10月19日晚间,离岸人民币对美元汇率盘中跌破7。27关口。截至10月20日12时,离岸人民币对美元汇率盘中最低下
HKCVG273QK显示器评测疾速表现无影随行最近,我们评测了多款HKC旗下猎鹰系列的电竞显示器产品,尽管它们在外观上都采用了家族式设计,但是在实际体验上却又各有不同。今天,我们为大家带来的就是猎鹰系列的新成员,也是此前评测的追光丨不为人知的细节好好的足球袜为啥剪破洞?如果您最近在熬夜看世界杯是否见过球员的球袜上有破洞尤其是上面英格兰队的萨卡这张图洞洞清晰可见您会不会纳闷?据传第一个被发现引领这种奇怪风潮的球员是2018年的世界杯预选赛上英格兰队金玟哉巴西队的强度在欧冠都难找两队差距确实大世界杯18决赛,巴西41韩国,赛后韩国队球员金玟哉接受了媒体采访。谈被淘汰坦白地说,双方个人能力存在很大差距。因为我们球队其实表现得非常出色,所以必须承认失败,因为实力不足而输掉了养发馆金银花酒治脱发作者见内文编辑段瑞校对许奇1金银花酒治脱发作者李冉浩我还不到40岁就出现脱发(诊断为斑秃),去很多医院治过,但头发还是长不出来。有人推荐我一种药酒方效果不错。配方如下金银花100克小卡复出准绝杀!快船2分险胜黄蜂,乔治197,沃尔12助攻NBA常规赛继续进行,黄蜂坐镇主场迎战快船,缺阵了半个月左右的卡椒双星选择复出,黄蜂虽饱受伤病困扰,但近4战3胜状态有所回暖。首节争夺,尽管快船占不到太大便宜,不过一直保持着微弱优我想去汕尾吃席了汕尾是一个风光旖旎四季如春的宝藏城市,是国家生态文明建设示范区,是冬养汕尾全国生态旅游示范实验区,也是中国海鲜美食之都理想的康养圣地。擂茶是一种用多种植物研磨成粉并用砂锅煮出来,再国际足联正式调查!围攻主裁判的乌拉圭队恐无缘下届世界杯2022世界杯最新消息,乌拉圭队摊上大事,国际足联正式起草文件调查乌拉圭队以及4名球员!本来卡塔尔世界杯就让国际足联陷入受贿风波,前国际足联主席布拉特也承认在卡塔尔举办世界杯是不适摩根我希望英格兰问鼎世界杯,若无法实现则乐意看到C罗捧杯直播吧12月7日讯英国名嘴皮尔斯摩根在社交媒体上表示,他支持英格兰问鼎本届世界杯,若无法实现,就希望C罗捧杯。葡萄牙在世界杯18决赛中6比1击败瑞士,晋级8强。对此皮尔斯摩根在社交英格兰世界杯如此华丽赢球的秘密用几张图让您看懂在一次足球锦标赛中,黄牌的数量是容易让人忽视却又比大多数人想象的更重要的事情。英格兰16强的对手塞内加尔在四年前的上一届世界杯小组赛中被淘汰,因为他们在三场比赛中的黄牌数量对于同组下班踩点走有错吗今天刷到女生准时下班被批踩点走我在想下班踩点走有错吗又不是活没干完。活干完了早点收拾,准点下班有问题吗?而且这老板要求有点奇葩,6点整走没礼貌,6点零几走怎么就礼貌了?我平时上班早沙特王室为保持血统纯正,优先考虑近亲通婚,为何后代不畸不蠢?我们普遍认为,近亲结婚不利于后代的健康,甚至还有很大的几率会导致一些遗传疾病,后人很有可能会出现畸形痴傻等情况。但是在盛行近亲结婚的沙特王室内部,却并没有出现这一情况,沙特的王子公
友情链接:快好找快生活快百科快传网中准网文好找聚热点快软网