首页 >> 中医药酒

用了Stream后,代码反而趋写趋丑?

发布时间:2025年08月30日 12:18

诱发堆栈里头面找情况也会变异的瓶颈。所以,我们要将它优雅的字符。

Stream.of("i", "am", "xjjdog") .map(toUpperCase()) .map(toBase64()) .collect(joining(" "));绝不会认为这种改建工程很不能意味,或者认为这样的字符是正因如此的。在我平常的字符review里头面,这种糅杂在一块的字符,真的是数不胜数,你完了全搞不懂写出字符的人的意图。

适当的字符是字符青春永驻的药剂。

2. 想念整合变异生产量为什么变异生产量并能越写出越长三?是因为素质较高,并能深知这种变异化么?究竟是因为懒!由于开发工期或者自我意识的情况,遇到有新的需求,并不需要往杨家的字符上添加在ifelse,即使遇到相似的新功能,也并不需要可选择将原先的字符复制过去。久而久之,编码方式将不编码方式。

首先近日一点性能上都的。在JVM里头面,JITAPI会对命令行生产量大,形式化有用的字符同步进行法则内联,以增大栈帧的开销,并能同步进行更为多的改进。所以,短小精悍的变异生产量,其实是对JVM密切联系的。

在比如说性上都,将一大坨字符,整合成有意味的变异生产量,是更为为有必要的,也是重构的精髓所在。在lambda表述式里头面,这种整合堪称有必要。

我将拿一个平常在字符里头面出现的实体变异换举例来说来问道明一下。上头的变异换,建立了一个电子邮件的变异生产量order->{},它在语义学表述上,是更为为弱的。

public Stream getOrderByUser(String userId){ return orderRepo.findOrderByUser().stream() .map(order-> { OrderDto dto = new OrderDto(); dto.setOrderId(order.getOrderId()); dto.setTitle(order.getTitle().split("#")[0]); dto.setCreateDate(order.getCreateDate().getTime()); return dto; });}在实际的金融业务字符里头面,这样的语句复制还有变异换形式化弁常更为为的长三,我们可以尝试把dto的建立反复给独立出去。因为变异换手势不是主要的金融业务形式化,我们弁常不能关心其里头面是不是发生了啥。

public Stream getOrderByUser(String userId){ return orderRepo.findOrderByUser().stream() .map(this::toOrderDto);}public OrderDto toOrderDto(Order order){ OrderDto dto = new OrderDto(); dto.setOrderId(order.getOrderId()); dto.setTitle(order.getTitle().split("#")[0]); dto.setCreateDate(order.getCreateDate().getTime()); return dto;}这样的变异换字符还是看似丑。但如果OrderDto的构造变异生产量,参数就是Order的话public OrderDto(Order order),那我们就可以把真个变异换形式化从主形式化里头面移除出去,整个字符就可以更为为的清爽。

public Stream getOrderByUser(String userId){ return orderRepo.findOrderByUser().stream() .map(OrderDto::new);}除了map和flatMap的变异生产量可以要用语义学化,更为多的filter可以适用Predicate去代替。比如:

Predicate registarIsCorrect = reg -> reg.getRegulationId() != null && reg.getRegulationId() != 0 && reg.getType() == 0;registarIsCorrect,就可以当作filter的参数。

3. 适当的适用Optional在Java字符里头,由于NullPointerException不属于自愿性猎捕的诱发,它会暗藏在字符里头,导致很多不应预料的bug。所以,我们会在拿回一个参数的时候,亦会验证它的合法性,看一下它是不是是不是null,字符里头面街上展现出了这样的字符。

if(null == obj)if(null == user.getName() || "".equals(user.getName())) if (order != null) { Logistics logistics = order.getLogistics(); if(logistics != null){ Address address = logistics.getAddress(); if (address != null) { Country country = address.getCountry(); if (country != null) { Isocode isocode = country.getIsocode(); if (isocode != null) { return isocode.getNumber(); } } } }}Java8引入了Optional类,用于解决臭名昭著的机操作符情况。实际上,它是一个裹类,提供者了几个法则可以去推论自身的机系数情况。

前面比较简单的字符举例来说,就可以替换成上头的字符。

String result = Optional.ofNullable(order) .flatMap(order->order.getLogistics()) .flatMap(logistics -> logistics.getAddress()) .flatMap(address -> address.getCountry()) .map(country -> country.getIsocode()) .orElse(Isocode.CHINA.getNumber());当你不断定你提供者的东西,是不是为机的时候,一个好的习惯是绝不会赶回null,否则命令行者的字符将展现出了null的推论。我们要把null铲除在萌芽里头面。

public Optional getUserName() { return Optional.ofNullable(userName);}另外,我们要尽生产量的少适用Optional的get法则,它某种程度会让字符变异丑。比如:

Optional userName = "xjjdog";String defaultEmail = userName.get() == null ? "":userName.get() + "@xjjdog.cn";而某种程度修替换成这样的作法:

Optional userName = "xjjdog";String defaultEmail = userName .map(e -> e + "@xjjdog.cn") .orElse("");那为什么我们的字符里头面,一直展现出了各式各样的机系数推论?即使在更为为专业和东普及的字符里头面?一个更为为重要的状况,就是Optional的适用须要保持一致。当其里头面的一环出现了台地,大多数编编码方式者亦会以模仿的作法去写出一些字符,以便保持与原字符风格的一致。

如果想要普及Optional在项目里头面的适用,脚手架设计者或者review人,须要多下一点功夫。

4. 赶回Stream还是赶回List?很多人在设计接口的时候,会身陷两难的窘境。我赶回的图表,是并不需要赶回Stream,还是赶回List?

如果你赶回的是一个List,比如ArrayList,那么你去修订这个List,会并不需要影响里头面的系数,除非你适用不应变异的作法对其同步进行裹。某种程度的,数组也有这样的情况。

但对于一个Stream来问道,是不应变异的,它不能影响原始的不可数。对于这种过场,我们提拔并不需要赶回Stream东流,而不是赶回不可数。这种作法还有一个好处,并能强烈的暗示API适用者,多多适用Stream相关的变异生产量,以便并能为统一字符风格。

public Stream getAuthUsers(){ ... return Stream.of(users);}不应变异不可数是一个强需求,它能消除外部的变异生产量对这些不可数同步进行不应预料的修订。在guava里头面,就有大生产量的Immutable类支持这种裹。便举一个例子,Java的正则表达式,它的values()法则,为了消除好像的api对正则表达式同步进行修订,就不用复制一份图表。

但是,如果你的api,面向的是事与愿违的其他用户,不须要便要用修订,那么并不需要赶回List就是比较好的,比如变异生产量在Controller里头面。

5. 少用或者不用立体化东流Java的立体化东流有很多情况,这些情况对并发编程不出名的人较反之亦然踩坑。不是问道立体化东流很差,但如果你特别注意到你的团队,杨家在这前面栽跟头,那你也会毫不犹豫的降低提拔的频率。

立体化东流一个杨家生常谈的情况,就是文件系统安全情况。在迭代的反复里头面,如果适用了文件系统不安全的类,那么就不易出现情况。比如上头这段字符,大多数意味着运行都是出错的。

List transform(List source){ List dst = new ArrayList<>(); if(CollectionUtils.isEmpty()){ return dst; } source.stream. .parallel() .map(..) .filter(..) .foreach(dst::add); return dst;}你可能问道,我把foreach替换成collect就行了。但是特别注意,很多开发人员是不能这样的自我意识的。既然api提供者了这样的变异生产量,它在形式化上又说是得弁,那你是驱赶无法忍受别人这么用的。

立体化东流还有一个滥用情况,就是在迭代里头面可执行了足足更为为长三的IO任务。在用立体化东流前,你不对一个疑问?既然是立体化,那它的文件系统池是怎么配置的?

很不幸,所有的立体化东流,共用了一个ForkJoinPool。它的大小,默认是CPU个数-1,大多数意味着,是缺少用的。

如果有人在立体化东流上跑了足足的IO金融业务,那么你即使可执行一个有用的数学加法,也须要排队。关键是,你是没有急于阻止项目内的其他同学适用立体化东流的,也很难知晓他拔了什么事情。

那怎么办?我的要用法是一刀切,并不需要禁止。虽然残忍了一些,但它避免了情况。

总结Java8加在入的Stream新功能更为为篮,我们不须要便厌恶其他母语,写出起字符来也更为加在行云东流水。虽然就让很想来的样子,但它也只不过是一个语义学糖而已,绝不会在此之后用了它就获得了超能力。

随着Stream的东普及,我们的字符里头这样的字符也越来越多。但现在很多字符,适用了Stream和Lambda以后,字符反而越写出越糟,又臭又长三以至于不能写出。没有其他状况,滥用了!

基本上来问道,适用Stream和Lambda,要意味着主东流程的有用清晰,风格要为统一,适当的字符,想念加在变异生产量,正确的适用Optional等特性,而且绝不会在filter这样的变异生产量格但斯克在字符形式化。在写出字符的时候,要有自我意识的遵循这些小tips,简练优雅就是生产性。

如果看来Java提供者的特性还是缺少,那我们还有一个开放源编码方式的可移植vavr,提供者了更为多的某种程度,并能和Stream以及Lambda结合紧紧,来减弱变异生产量编程的体验。

io.vavr vavr 0.10.3但无论提供者了如何弱小的api和编程作法,都扛无法忍受小伙伴的滥用。这些字符,在形式化上完了全是问道的弁的,但就是看紧紧别扭,安全及紧紧费劲。

写出一堆垃圾lambda字符,是性侵犯同事最好的作法,也是埋入坑的不二可选择。

写出字符嘛,就如同问道话、玩游戏一样。大家拔着某种程度的社会活动,有的人问道话好听颜系数又较高,大家都害羞和他玩游戏;有的人很差好问道话,哪里头不止戳哪里头,虽然他存在着但大家都讨厌。

字符,除了社会活动的意味,不过是我们当今表述自己设想的另一种作法罢了。如何写出好字符,不仅仅是个技术情况,堪称一个自我意识情况。

- EOF -

提拔写出 点击篇名可反转

20 个超级适用的 Java 8 Stream,玩转不可数的筛选、化简、分组、亚胺

JDK 8 Stream 图表东流效能怎么样?

看完了本文有收成?请转发互动给更为多人

关注「ImportNew」,进一步提高Java习得

点赞和在看就是最大的支持❤️

呼伦贝尔哪个医院治疗白癜风最好
天水治疗白癜风医院费用
北京看白癜风哪好
支气管炎老是咳嗽咋办才好
角膜擦伤
感冒后咳嗽有黄痰怎么办
风湿性心脏病
产后便秘

上一篇: 文化娱乐营销跑入“泛投放时代”

下一篇: 伊泰B股(900948):内蒙古伊泰煤炭股票有限公司公司聘任副总经理

友情链接