重庆网站建站一站式服务,淄博网络优化哪家专业,网站备案网址,女儿考试没圈关键词在日常开发中#xff0c;Stream API 提供了一种高效且易于使用的工具集来处理集合数据。
本文主要讲解 Stream 的两个特性#xff1a;惰性执行#xff0c;不修改原始数据源。
为什么说这两个、而不讲下其他的特性呢#xff1f;主要是因为在开发中如果忽略这两个特性的话Stream API 提供了一种高效且易于使用的工具集来处理集合数据。
本文主要讲解 Stream 的两个特性惰性执行不修改原始数据源。
为什么说这两个、而不讲下其他的特性呢主要是因为在开发中如果忽略这两个特性的话使用 Stream 写出来的代码就可能 Bug 多多啊因此在这里特别强调下。
1.惰性执行
1.1.说明
惰性执行 意味着 Stream 的中间操作intermediate operations如filter, map不会立即执行而是在遇到终止操作terminal operations如forEach, collect时才会触发。
1.2.反例 考虑以下代码
ListString words Arrays.asList(apple, banana, cherry);
words.stream().filter(word - {System.out.println(Filtering: word);return word.startsWith(a);});以上代码执行后并不会有打印输出这是因为尽管调用了中间操作 filter但是 filter 后并没有调用终止操作的方法。
1.3.正确使用
应该习惯性地在流操作的最后都调用一个终止操作。
例如
words.stream().filter(word - word.startsWith(a)).forEach(System.out::println);1.3.1.如何区分中间操作和终止操作
这其实很简单如果一个方法的返回结果为一个新的流 (Stream)那么它是中间操作否则就是终止操作。
2.不修改原始数据源
2.1.说明
Stream 的操作并不会改变原始数据Stream 操作都是基于原始数据创建新的结果。
2.2.反例 假设有如下代码
ListInteger numbers new ArrayList(Arrays.asList(1, 2, 3));
numbers.stream().map(n - n * 2).collect(Collectors.toList());System.out.println(numbers); // 输出 [1, 2, 3]可能有人会错误地认为Stream 操作执行后numbers列表的元素会发生改变然后就把numbers作为计算后的结果接着往下执行逻辑。
但实际上Stream 操作的结果是生成了一个新的集合而原始的集合numbers保持不变。
2.3.正确使用
应该用一个新对象接收 Stream 操作的结果后续如果需要使用计算后的结果使用的应该是这个新的对象而不是原始的数据集合。
ListInteger numbers new ArrayList(Arrays.asList(1, 2, 3));
ListInteger doubledNumbers numbers.stream().map(n - n * 2).collect(Collectors.toList());
System.out.println(doubledNumbers); // 输出 [2, 4, 6]又或者可以直接用 Stream 操作的结果覆盖掉原始的数据对象。
ListInteger numbers new ArrayList(Arrays.asList(1, 2, 3));
numbers numbers.stream().map(n - n * 2).collect(Collectors.toList());
System.out.println(numbers); // 输出 [2, 4, 6]如果有帮助的话可以点个赞支持一下嘛