24

Java 8 的 Stream 流真香,没体验过的永远不知道

 4 years ago
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 程序员跟 PythonRuby 等程序员撕逼的时候,也能够扬眉吐气一把;因为 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);

还有更多

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

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·大数据·个人成长

rAryeqV.jpg!web

微信号:huakuohao-mc

点一下你会更好看耶

7J7VZvy.gif


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK