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

栏目: 编程语言 · Java · 发布时间: 5年前

内容简介:优质文章,第一时间送达

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

优质文章,第一时间送达

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

文章转自:占小狼的博客

一直在写中间件相关的代码,提供SDK给业务方使用,但很多业务方还一直停留在1.7版本,迟迟不升级,为了兼容性,不敢在代码中使用 Java 8的一些新特性,比如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 的这个特性,用起来真的很爽!


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

轻量级Django

轻量级Django

茱莉亚·埃尔曼 (Julia Elman)、马克·拉温 (Mark Lavin) / 侯荣涛、吴磊 / 中国电力出版社; 第1版 / 2016-11-1 / 35.6

自Django 创建以来,各种各样的开源社区已经构建了很多Web 框架,比如JavaScript 社区创建的Angular.js 、Ember.js 和Backbone.js 之类面向前端的Web 框架,它们是现代Web 开发中的先驱。Django 从哪里入手来适应这些框架呢?我们如何将客户端MVC 框架整合成为当前的Django 基础架构? 本书讲述如何利用Django 强大的“自支持”功......一起来看看 《轻量级Django》 这本书的介绍吧!

MD5 加密
MD5 加密

MD5 加密工具

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具