Java 8 的 Stream 流真香,没体验过的永远不知道
source link: https://mp.weixin.qq.com/s/v2uZnkWhGKXvTJu87iUWLg
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
花括号MC(huakuohao-mc):关注JAVA基础编程及大数据,注重经验分享及个人成长。
虽 然 现 在 Oacle
官方发布的最新 JDK
版本已经到了 JDK14
。 但我相信很多团队的生产系统还是 JDK8
,甚至有的团队还是 JDK7
或者 JDK6
。 即便很多团队已经将生产环境升级为 JDK8
,但是代码却还是老代码,也就是说根本没有使用 JDK8
提供的新特性。
JDK8
给程序员来带了很多便利,甚至可以让 Java
程序员跟 Python
, Ruby
等程序员撕逼的时候,也能够扬眉吐气一把;因为 JDK8
终于开始支持“行为参数化了”,也就是大家经常说的, 可以把一个函数当作参数传给另一个函数 。
JDK8
最明显的两个变化就是开始支持 Lambda
表达式,以及集合的 Stream
流式处理。这两个特性都可以让我们写的代码更优雅,也能让我们在实现某些功能的时候更轻松,特别是 Stream
,那简直是超级好用,性价比超级高,花上20分钟去学习一下,就能让你的代码质量提升一个档次。
下面我列举几个简单的小场景,让各位感受一下 Java8
提供的 Stream
API是多么的方便优雅,也算是给各位抛砖引玉了。
日常编码的时候,我们用的最多的应该就是集合了。比如从数据库里查询出一天卖出去多少本书,一般我们会这样写, List<Book> books = query.find(date);
然后针对这个集合会做各种各样的操作来满足产品层面的需求。
场景一:打印出每本书的详情。
JDK8之前
1//打印出每本书的详情 2for (Book book : books){ 3 System.out.println(book.toString()); 4}
使用Stream之后
1//打印每本书详情 2books.stream().forEach(book -> book.toString());
场景二:选出价格高于20元的
JDK8之前
1List<Book> highPriceBooks = new ArrayList<>(); 2for (Book book : books){ 3 if (book.getPrice()>20){ 4 highPriceBooks.add(book); 5 } 6}
使用Stream之后
1highPriceBooks = books.stream().filter(book -> book.getPrice()>20).collect(Collectors.toList());
场景三: 按照书价排序
JDK8之前
1List<Book> sortBooks = new ArrayList<>(); 2for (Book book : books){ 3 Collections.sort(books, new Comparator<Book>() { 4 @Override 5 public int compare(Book o1, Book o2) { 6 if (o1.getPrice() > o2.getPrice()){ 7 return 1; 8 }else if (o1.getPrice() < o2.getPrice()){ 9 return -1; 10 }else { 11 return 0; 12 } 13 } 14 }); 15}
使用Stream之后
1sortBooks = books.stream().sorted(Comparator.comparing(Book::getPrice)).collect(Collectors.toList());
如果你喜欢可以直接通过 reversed()
反转,像这样
1sortBooks = books.stream().sorted(Comparator.comparing(Book::getPrice).reversed()).collect(Collectors.toList());
场景四:获取所有书名
JDK8之前
1List<String> bookNames = new ArrayList<>(); 2for (Book book : books){ 3 bookNames.add(book.getName()); 4}
使用Stream之后
1bookNames = books.stream().map(Book::getName).collect(Collectors.toList());
场景五:获得所有书价格总和
JDK8之前
1//计算一天当中卖出的所有书的价格总和。 2int totalNum = 0; 3for (Book book : books){ 4 totalNum += book.getPrice(); 5}
使用Stream之后
1totalNum = books.stream().map(Book::getPrice).reduce(0,(a,b)->a+b);
还有更多
你以为 JDK8
的 Stream
就这么点本事吗?它还可以完成链式处理,像这样
1//选出价格高于20的两个元素。 2books.stream().filter(book -> book.getPrice()> 20).limit(2).collect(Collectors.toList());
此外如果你想利用你多核的CPU并行处理集合以提高计算速度,在 JDK8
中只需要简单的调用一下 parallelStream
方法。就像这样 books.parallelStream().forEach(book ->book.toString());
JDK自动帮你并行处理,厉不厉害。
好了,就写这么多了,更多的使用技巧还得你自己去挖掘体会,我要去撸代码了,拜拜!
记住一句话, Java8
提供的那些新东西,值得你花更多的精力去学习研究。
·END·
花括号MC
Java·大数据·个人成长
微信号:huakuohao-mc
点一下你会更好看耶
Recommend
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK