转载

Java8 的这个特性,用起来真的很爽!

点击上方 蓝色字体 ,选择“设置星标”

优质文章,第一时间送达

Java8 的这个特性,用起来真的很爽!

文章转自:占小狼的博客

一直在写中间件相关的代码,提供SDK给业务方使用,但很多业务方还一直停留在1.7版本,迟迟不升级,为了兼容性,不敢在代码中使用Java8的一些新特性,比如Stream之类的,虽然不能用,但还是要学一下。

Stream 是什么

Stream 是Java 8中添加的一个新特性,它与 java.io 包里的 InputStream 和 OutputStream 是完全不同的概念。 它借助于 Lambda 表达式,可以让你以一种声明的方式处理数据,可以极大提高Java程序员的生产力,让程序员写出高效率、干净、简洁的代码。

Stream Demo

直接上Demo,感受一下

Stream 如何工作

当使用一个流的时候,通常包括三个基本步骤:

  • 获取一个数据源(source)

  • 数据转换

  • 执行操作获取想要的结果

每次转换原有 Stream 对象不改变,返回一个新的 Stream 对象(可以有多次转换),这就允许对其操作可以像链条一样排列,变成一个管道,如下图所示。

Java8 的这个特性,用起来真的很爽!

在Stream中,分为两种操作

  • 中间操作

  • 结束操作

中间操作返回Stream,终端操作返回void或者非Stream结果,在demo中, filter map sorted 都算是中间操作,而 forEach 是一个结束操作。

Stream 如何生成

创建Stream的方式很多,最常见的是从Collections,List 和 Set中生成

在对象myList上调用方法 stream() 返回一个常规对象Stream。

也可以从一堆已知对象中生成。

当然了,还有其它方式:

  • Collection.stream()

  • Collection.parallelStream()

  • BufferedReader.lines()

  • Files.walk()

  • BitSet.stream()

  • Random.ints()

  • JarFile.stream()

  • ....

常规操作

forEach

forEach 方法接收一个 Lambda 表达式,用来迭代流中的每个数据

map

map 用于映射每个元素到对应的结果

filter

filter 用于通过设置的条件过滤出元素

limit

limit 用于用于获取指定数量的流

sorted

sorted 用于对流进行排序

Match

有三个 match 方法,从语义上说:

  • allMatch:Stream 中全部元素符合传入的 predicate,返回 true

  • anyMatch:Stream 中只要有一个元素符合传入的 predicate,返回 true

  • noneMatch:Stream 中没有一个元素符合传入的 predicate,返回 true

它们都不是要遍历全部元素才能返回结果。 例如 allMatch 只要一个元素不满足条件,就 skip 剩下的所有元素,返回 false。

reduce

reduce 方法根据指定的函数将元素序列累积到某个值。 此方法有两个参数:

  • 起始值

  • 累加器函数。

如果有一个List ,希望得到所有这些元素和一些初始值的总和。

collect

Collectors类中提供了功能丰富的工具方法

  • toList

  • toSet

  • toCollection

  • toMap

  • ...

而这些方法,都需要通过 collect 方法传入。

collect 可以把Stream数据流转化为Collection对象,

骚技巧

for循环

除了常规的对象Stream,还有一些有特殊类型的Stream,用于处理基本数据类型int、long和double,它是IntStream、LongStream和DoubleStream。

比如可以使用IntStream.range()来代替常规的for循环。

随机数

Random的ints方法可以返回一个随机数据流,比如返回1到100的10个随机数。

大小写转化

Stream 特点

总之,Stream 的特性可以归纳为:

无存储

Stream并不是一种数据结构,它只是某种数据源的一个视图

安全性

对Stream的任何修改都不会修改背后的数据源,比如对stream执行过滤操作并不会删除被过滤的元素,而是会产生一个不包含被过滤元素的新Stream。

惰式执行

Stream上的操作并不会立即执行,只有等到用户真正需要结果的时候才会执行。

一次性

Stream只能被“消费”一次,一旦遍历过就会失效,就像容器的迭代器那样,想要再次遍历必须重新生成。

lambda

所有 Stream 的操作必须以 lambda 表达式为参数

遗漏热文?赶紧标星

Java8 的这个特性,用起来真的很爽!

1.  阿里社招面试指南

2.  阿里应届生面试指南

3.  探寻线程池是如何工作的

4.  到底线程池应该设置多少合适?

5.  跳槽的必备条件是有一份好的简历

6.  不是所有的 Github 都适合写在简历上

7.  所没有项目经验找工作处处碰壁怎么办

8.  每一个开发人员都应该懂得的 UML 规范

9.  工作环境没机会接触高并发、分布式怎么办?

10.  这算是有史以来讲数据库连接池数最清楚的文章了

11.  你以为认为 count(1) 比 count(*) 效率高么?

12.  用了这么多年 Spring Boot 你知道他爹有多大背景吗?

Java8 的这个特性,用起来真的很爽!

原文  http://mp.weixin.qq.com/s?__biz=MzIyNzc1ODQ0MQ==&mid=2247484255&idx=1&sn=a1b102f73891cb122a665138eef62d21
正文到此结束
Loading...