一句话搞懂Java8 stream!!!

举报
香菜聊游戏 发表于 2021/07/15 01:22:48 2021/07/15
【摘要】 今天正式开始写第一期。希望自己能坚持下去。 在review代码的过程中,经常看到一些代码能够使用stream的方式处理的更好,会建议同事使用stream。 stream 作为 Java 8 提供的 特性,过去这么多年了,但是在开发中有些程序小哥哥依然不愿意使用,觉得代码不够直白,宁愿多写一些for循环,但是历史证明新欢总比旧爱好,留下的都是优质的。不去接触,学习下新鲜...

一句话搞懂Java8 stream!!!

今天正式开始写第一期。希望自己能坚持下去。

在review代码的过程中,经常看到一些代码能够使用stream的方式处理的更好,会建议同事使用stream。

stream 作为 Java 8 提供的 特性,过去这么多年了,但是在开发中有些程序小哥哥依然不愿意使用,觉得代码不够直白,宁愿多写一些for循环,但是历史证明新欢总比旧爱好,留下的都是优质的。不去接触,学习下新鲜事物,必将成为一个老古董 。只要你想下车撒泡尿,你就会被历史的车轮无情甩下,因为这是一趟高铁。你看新欢正在向你招手。

640?wx_fmt=jpeg&tp=webp&wxfrom=5&wx_lazy=1&wx_co=1

1、为什么不愿意使用流

我认为有几方面的原因:

一是现在的for while 能解决问题,没必要

二是没有发现stream的好,不愿意使用。

三是自己没有抓住理解的核心,记忆起来很费劲,用起来不顺手。

2、理解流

流 如字面意思,顺序处理,最终产出结果。

我的理解,流和sql 有差不多的行为方式。对数据进行筛选,整合。

 

作为Java程序员一般都会知道如何写Sql,一个简单的sql 像下面这样:


  
  1. select * from table where 限制条件 group by 条件 limit 10
  2. 从数据源中过滤出数据,进行分组,然后取一部分。

sql能做的事,流基本都能做。

3、举个例子

 

定义Player类的定义如下:


  
  1. /**
  2. * 玩家类
  3. * 公众号:香菜聊游戏
  4. */
  5. @AllArgsConstructor
  6. public class Player {
  7. // 名字
  8. @Getter @Setter
  9. public String name;
  10. // 性别
  11. @Getter @Setter
  12. private int sex;
  13. // 年龄
  14. @Getter @Setter
  15. private int age;
  16. // 工资
  17. @Getter @Setter
  18. private int salary;
  19. }

1、过滤数据 ==>where


  
  1. // 过滤出年龄在18岁以上的所有人的名字
  2. List<Player> age18List = playerList.stream()
  3. .filter(player -> player.getAge() > 18)
  4. .collect(Collectors.toList());

2、过滤字段 ==>也就是select 的列


  
  1. List<String> age18NameList = playerList.stream()
  2. .filter(player -> player.getAge() > 18)
  3. .map(Player::getName)
  4. .collect(Collectors.toList());

3、分组,按性别分组 ==> group by


  
  1. Map<Integer, List<Player>> age18GroupMap = playerList.stream()
  2. .filter(Player -> Player.getAge() > 18)
  3. .collect(Collectors.groupingBy(Player::getSex));

4、排序后取前两位 ==> limit


  
  1. // 过滤出年龄在18岁以上并且最小的2个
  2. List<Player> age18List = playerList.stream()
  3. .sorted(Comparator.comparingInt(Player::getAge))
  4. .limit(2)
  5. .collect(Collectors.toList());

5、求和 ==> sum


  
  1. Integer age18SumSalary = playerList.stream()
  2. .map(Player::getSalary)
  3. .reduce(0,Integer::sum);

以上几个例子只是stream的一些举例,介绍了和sql 的相似性。只要你想到的都可以实现。sql不好实现的stream也可以实现。在学习的时候先了解,在使用的时候不清楚可以搜索一下,多用几次就熟练了,就掌握了。stream没有增加什么新的东西,只是新瓶装旧酒,不同的语法形式而已。

选择「爱我」还是「恨我」,这矛盾永远存在... 恨我,因为我华美的表演,我自信到狂妄 恨我,因为我精准的后仰跳投,我对胜利的热切渴望 恨我,因为我是个无所不能的老手,一个胜者 憎恨我吧,请用你身体中的每一个细胞来狠狠的憎恨我,憎恨我被同样执著的一群人所深爱着

居然和你的丝毫不差…

4、总结

stream让我们的代码更简洁,逻辑上更加顺畅,写更少的代码,做更多的事。stream 解开了代码细节和业务逻辑的耦合,表达的是"要做什么"而不是"如何去做",可以更加专注于业务逻辑,写出易于理解和维护的代码。用sql的知识做类比,去完成对stream的认识,学习,知识迁移是我们学习的捷径,你掌握了吗?

有愿意加入分享的大佬联系我!!!

有不明白的可以私聊我,一起学习交流。

最后分享一本书 《JVM高级特性与最佳实践》,回复 “JVM高级特性与最佳实践”获取链接。

文章来源: gamwatcher.blog.csdn.net,作者:香菜聊游戏,版权归原作者所有,如需转载,请联系作者。

原文链接:gamwatcher.blog.csdn.net/article/details/105187515

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。