Stream是Java8提供的一种更加简便的,对集合类型数据结构的处理API。

这里的集合类型数据结构包括各种数组(int[]/String[]等),也包括CollectionMap等实现类。

1 传统方式操作集合

在处理集合类型数据结构时,我们通常会遍历得到每个元素,对每个元素进行处理。操作维度在元素的层面。

例如,我们需要统计一串数字中的奇数。

如果是数组数据结构

int[] nums = new int[]{1,2,3,4,5,6,7,8,9};
int count = 0;
for(int i = 0; i < nums.length; ++i) {
    // 1、遍历得到每个元素
    int num = nums[i];
    // 2、对每个元素进行处理
    if (num % 2 == 1) {
        ++count;
    }
}

如果是List数据结构

List<Integer> nums = Arrays.asList(1,2,3,4,5,6,7,8,9);
Iterator<Integer> iterator = nums.iterator();
int count = 0;
while(iterator.hasNext()) {
    // 1、遍历得到每个元素
    int num = iterator.next();
    // 2、对每个元素进行处理
    if (num % 2 == 1) {
        ++count;
    }
}

使用增强for循环:

int count = 0;
// 1、遍历得到每个元素
for(int num: nums) {
    // 2、对每个元素进行处理
    if(num % 2 == 1) {
        ++count;
    }
}

2 Stream操作集合

在使用Stream操作集合类型数据结构时,操作维度在层面。

例如,对于上述例子,使用Stream进行相同的操作可能如下:

// 1、获取原始数组的流
IntStream intStream = Arrays.stream(nums);
// 2、获取过滤后的流
IntStream filterStream = intStream.filter(num -> num % 2 == 1);
// 3、统计过滤后的流中元素的个数
long count = filterStream.count();

看上去也需要很多行代码,但其实Stream的操作都是链式的,它还可以写成这样:

long count = Arrays.stream(nums).filter(num -> num % 2 == 1).count();

3 比较

我们可以明显感觉到传统方式和Stream API操作集合类型数据结构的区别。

传统方式的操作维度在元素的层面:

  • 遍历获取每个元素。
  • 针对每个元素进行操作。

Stream的操作维度在的层面:

  • 根据集合类型数据结构创建Stream
  • 每次对旧Stream操作后会得到新的Stream
  • 对最后一个Stream进行统计/收集等操作,获得最终结果。

Stream最大的特点是,它是链式操作,可以将多个业务逻辑清晰地分割成多个中间操作。例如,我们可以先去重(distinct()),然后过滤filter(),最后排序(sort())。

此外,Stream内部封装了许多模板式代码,通过结合lambda表达式,极大地简化地代码。

因此,在使用Stream操作集合时,可以以更高的维度、更简洁的代码、更清晰的业务逻辑进行业务处理,使用起来十分顺畅。

原文地址:http://www.cnblogs.com/Xianhuii/p/16927012.html

1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长! 2. 分享目的仅供大家学习和交流,请务用于商业用途! 3. 如果你也有好源码或者教程,可以到用户中心发布,分享有积分奖励和额外收入! 4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解! 5. 如有链接无法下载、失效或广告,请联系管理员处理! 6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需! 7. 如遇到加密压缩包,默认解压密码为"gltf",如遇到无法解压的请联系管理员! 8. 因为资源和程序源码均为可复制品,所以不支持任何理由的退款兑现,请斟酌后支付下载 声明:如果标题没有注明"已测试"或者"测试可用"等字样的资源源码均未经过站长测试.特别注意没有标注的源码不保证任何可用性