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

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

虽然现在Oacle官方发布的最新JDK版本已经到了JDK14。但我相信很多团队的生产系统上还是JDK8,甚至有的团队还是JDK7或者JDK6。即便很多团队已经将生产环境升级为JDK8,但是代码却还是老代码,也就是说根本没有使用JDK8提供的新特性。

JDK8 给程序员来带了很多便利,甚至可以让Java程序员跟Python,Ruby等程序员撕逼的时候,也能够扬眉吐气一把;因为JDK8终于开始支持“行为参数化了”,也就是大家经常说的,可以把一个函数当作参数传给另一个函数。

JDK8最明显的两个变化就是开始支持Lambda表达式,以及集合的Stream流式处理。这两个特性都可以让我们写的代码更优雅,也能让我们在实现某些功能的时候更轻松,特别是Stream,那简直是超级好用,性价比超级高,花上20分钟去学习一下,就能让你的代码质量提升一个档次。

下面我列举几个简单的小场景,让各位感受一下Java8提供的StreamAPI是多么的方便优雅,也算是抛砖引玉了。

日常编码的时候用的最多的应该就是集合了。比如从数据库里查询出一天卖出去多少本书,一般我们会这样写,List books = query.find(date); 然后针对这个集合会做各种各样的操作来满足产品层面的需求。

场景一:打印出每本书的详情。

JDK8之前

<code> 

for

(Book

book

: books){

System

.out

.println

(book.toString()); }/<code>

使用Stream之后

<code> 

books

.stream

()

.forEach

(book -> book.toString());/<code>
场景二:选出价格高于20元的

JDK8之前

<code>List highPriceBooks = 

new

ArrayList<>();

for

(Book book : books){

if

(book.getPrice()>

20

){ highPriceBooks.

add

(book); } }/<code>

使用Stream之后

<code>

highPriceBooks

= books.stream().filter(book -> book.getPrice()>

20

).collect(Collectors.toList())/<code>
场景三: 按照书价排序

JDK8之前

<code>List sortBooks = 

new

ArrayList<>();

for

(Book book : books){ Collections.sort(books,

new

Comparator() {

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

; } }    }); }/<code>

使用Stream之后

<code>

sortBooks

= books.stream().sorted(Comparator.comparing(Book::getPrice)).collect(Collectors.toList())/<code>

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

<code>

sortBooks

= books.stream().sorted(Comparator.comparing(Book::getPrice).reversed()).collect(Collectors.toList())/<code>
场景四:获取所有书名

JDK8之前

<code>List bookNames = 

new

ArrayList<>();

for

(Book book : books){ bookNames.

add

(book.getName()); }/<code>

使用Stream之后

<code>

bookNames

= books.stream().map(Book::getName).collect(Collectors.toList())/<code>
场景五:获得所有书价格总和

JDK8之前

<code>

//计算一天当中卖出的所有书的价格总和。

int

totalNum = 0;

for

(Book book : books){

totalNum

+= book.getPrice();

}

/<code>

使用Stream之后

<code>totalNum = books.stream().map(Book::getPrice).reduce(

0

,

(a,b)

->

a+b);/<code>
还有更多

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

<code> 

books

.stream

()

.filter

(book -> book.getPrice()>

20

)

.limit

(

2

)

.collect

(Collectors.toList());/<code>

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

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

作者:花括号MC

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

来源:掘金


分享到:


相關文章: