Java8的Stream流真香,没体验过的永远不会知道

原创:花括号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之前

//打印出每本书的详情
for (Book book : books){
    System.out.println(book.toString());
}
复制代码

使用Stream之后

//打印每本书详情
books.stream().forEach(book -> book.toString());
复制代码

场景二:选出价格高于20元的

JDK8之前

List<Book> highPriceBooks = new ArrayList<>();
for (Book book : books){
    if (book.getPrice()>20){
        highPriceBooks.add(book);
    }
}
复制代码

使用Stream之后

highPriceBooks = books.stream().filter(book -> book.getPrice()>20).collect(Collectors.toList());
复制代码

场景三: 按照书价排序

JDK8之前

List<Book> sortBooks = new ArrayList<>();
for (Book book : books){
    Collections.sort(books, new Comparator<Book>() {
        @Override
        public int compare(Book o1, Book o2) {
            if (o1.getPrice() > o2.getPrice()){
                return 1;
            }else if (o1.getPrice() < o2.getPrice()){
                return -1;
            }else {
                return 0;
            }
        }    
     });
}
复制代码

使用Stream之后

sortBooks = books.stream().sorted(Comparator.comparing(Book::getPrice)).collect(Collectors.toList());
复制代码

如果你喜欢可以直接通过 reversed()
反转,像这样

sortBooks = books.stream().sorted(Comparator.comparing(Book::getPrice).reversed()).collect(Collectors.toList());
复制代码

场景四:获取所有书名

JDK8之前

List<String> bookNames = new ArrayList<>();
for (Book book : books){
    bookNames.add(book.getName());
}
复制代码

使用Stream之后

bookNames = books.stream().map(Book::getName).collect(Collectors.toList());
复制代码

场景五:获得所有书价格总和

JDK8之前

//计算一天当中卖出的所有书的价格总和。
int totalNum = 0;
for (Book book : books){
    totalNum += book.getPrice();
}
复制代码

使用Stream之后

totalNum = books.stream().map(Book::getPrice).reduce(0,(a,b)->a+b);
复制代码

还有更多

你以为 JDK8
Stream
就这么点本事吗?它还可以完成链式处理,像这样

//选出价格高于20的两个元素。
books.stream().filter(book -> book.getPrice()> 20).limit(2).collect(Collectors.toList());
复制代码

此外如果你想利用你多核的CPU并行处理集合以提高计算速度,在 JDK8
中只需要简单的调用一下 parallelStream
方法。就像这样 books.parallelStream().forEach(book -> book.toString());
JDK自动帮你并行处理,厉不厉害。

好了,就写这么多了,更多的使用技巧还得你自己去挖掘体会,我要去撸代码了,拜拜!
记住一句话, Java8
提供的那些新东西,值得你花更多的精力去学习研究。

原文 

https://juejin.im/post/5e9672af6fb9a03c5f73fd28

本站部分文章源于互联网,本着传播知识、有益学习和研究的目的进行的转载,为网友免费提供。如有著作权人或出版方提出异议,本站将立即删除。如果您对文章转载有任何疑问请告之我们,以便我们及时纠正。

PS:推荐一个微信公众号: askHarries 或者qq群:474807195,里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化这些成为架构师必备的知识体系。还能领取免费的学习资源,目前受益良多

转载请注明原文出处:Harries Blog™ » Java8的Stream流真香,没体验过的永远不会知道

赞 (0)
分享到:更多 ()

评论 0

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址