Java 8 的 Stream 流真香,没体验过的永远不知道
2009 年 5 月 10 日
JDK8
给程序员来带了很多便利,甚至可以让 Java
程序员跟 Python
, Ruby
等程序员撕逼的时候,也能够扬眉吐气一把;因为 JDK8
终于开始支持“行为参数化了”,也就是大家经常说的, 可以把一个函数当作参数传给另一个函数 。
JDK8
最明显的两个变化就是开始支持 Lambda
表达式,以及集合的 Stream
流式处理。这两个特性都可以让我们写的代码更优雅,也能让我们在实现某些功能的时候更轻松,特别是 Stream
,那简直是超级好用,性价比超级高,花上20分钟去学习一下,就能让你的代码质量提升一个档次。
下面我列举几个简单的小场景,让各位感受一下 Java8
提供的 Stream
API是多么的方便优雅,也算是给各位抛砖引玉了。
日常编码的时候,我们用的最多的应该就是集合了。比如从数据库里查询出一天卖出去多少本书,一般我们会这样写, List 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 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 sortBooks = new ArrayList(); 2for (Book book : books){ 3 Collections.sort(books, new Comparator() { 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 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
提供的那些新东西,值得你花更多的精力去学习研究。