public class IntStreamTest {
public static void main(String[] args) {
IntStream is = IntStream.builder().add(20).add(13).add(-2).add(18).build();
// 下面调用聚集方法的代码每次只能执行一行
System.out.println("is 所有元素的最大值:" + is.max().getAsInt());
System.out.println("is 所有元素的最小值:" + is.min().getAsInt());
System.out.println("is 所有元素的总和:" + is.sum());
System.out.println("is 所有元素的总数:" + is.count());
System.out.println("is 所有元素的平均值:" + is.average());
System.out.println("is所有元素的平方是否都大于20: " + is.allMatch(ele -> ele * ele > 20));
System.out.println("is是否包含任何元素的平方大于20 : " + is.anyMatch(ele -> ele * ele > 20));
// 将is映射成一个新Stream,新Stream的每个元素是原Stream元素的2倍+1
IntStream newIs = is.map(ele -> ele * 2 + 1);
// 使用方法引用的方式来遍历集合元素
newIs.forEach(System.out::println); // 输岀 41 27 -3 37
}
}
上面程序先创建了一个 IntStream,接下来分别多次调用 IntStream 的聚集方法执行操作,这样即可获取该流的相关信息。注意:上面 5~13 行代码每次只能执行一行,因此需要把其他代码注释掉。| 方法 | 说明 |
|---|---|
| filter(Predicate predicate) | 过滤 Stream 中所有不符合 predicate 的元素 |
| mapToXxx(ToXxxFunction mapper) | 使用 ToXxxFunction 对流中的元素执行一对一的转换,该方法返回的新流中包含了 ToXxxFunction 转换生成的所有元素。 |
| peek(Consumer action) | 依次对每个元素执行一些操作,该方法返回的流与原有流包含相同的元素。该方法主要用于调试。 |
| distinct() | 该方法用于排序流中所有重复的元素(判断元素重复的标准是使用 equals() 比较返回 true)。这是一个有状态的方法。 |
| sorted() | 该方法用于保证流中的元素在后续的访问中处于有序状态。这是一个有状态的方法。 |
| limit(long maxSize) | 该方法用于保证对该流的后续访问中最大允许访问的元素个数。这是一个有状态的、短路方法。 |
| 方法 | 说明 |
|---|---|
| forEach(Consumer action) | 遍历流中所有元素,对每个元素执行action |
| toArray() | 将流中所有元素转换为一个数组 |
| reduce() | 该方法有三个重载的版本,都用于通过某种操作来合并流中的元素 |
| min() | 返回流中所有元素的最小值 |
| max() | 返回流中所有元素的最大值 |
| count() | 返回流中所有元素的数量 |
| anyMatch(Predicate predicate) | 判断流中是否至少包含一个元素符合 Predicate 条件。 |
| allMatch(Predicate predicate) | 判断流中是否每个元素都符合 Predicate 条件 |
| noneMatch(Predicate predicate) | 判断流中是否所有元素都不符合 Predicate 条件 |
| findFirst() | 返回流中的第一个元素 |
| findAny() | 返回流中的任意一个元素 |
public class CollectionStream {
public static void main(String[] args) {
// 创建一个集合
Collection objs = new HashSet();
objs.add(new String("C语言中文网Java教程"));
objs.add(new String("C语言中文网C++教程"));
objs.add(new String("C语言中文网C语言教程"));
objs.add(new String("C语言中文网Python教程"));
objs.add(new String("C语言中文网Go教程"));
// 统计集合中出现“C语言中文网”字符串的数量
System.out.println(objs.stream().filter(ele -> ((String) ele).contains("C语言中文网")).count()); // 输出 5
// 统计集合中出现“Java”字符串的数量
System.out.println(objs.stream().filter(ele -> ((String) ele).contains("Java")).count()); // 输出 1
// 统计集合中出现字符串长度大于 12 的数量
System.out.println(objs.stream().filter(ele -> ((String) ele).length() > 12).count()); // 输出 1
// 先调用Collection对象的stream ()方法将集合转换为Stream
// 再调用Stream的mapToInt()方法获取原有的Stream对应的IntStream
objs.stream().mapToInt(ele -> ((String) ele).length())
// 调用forEach()方法遍历IntStream中每个元素
.forEach(System.out::println);// 输出 11 11 12 10 14
}
}
输出结果为:
5 1 1 11 11 12 10 14
从上面代码第 11~20 行可以看出,程序只要调用 Collection 的 stream() 方法即可返回该集合对应的 Stream,接下来就可通过 Stream 提供的方法对所有集合元素进行处理,这样大大地简化了集合编程的代码,这也是 Stream 编程带来的优势。
版权说明:Copyright © 广州松河信息科技有限公司 2005-2025 版权所有 粤ICP备16019765号
广州松河信息科技有限公司 版权所有