本文共 2599 字,大约阅读时间需要 8 分钟。
Stream API是Java中的一个核心功能,用于对数据源进行流式处理。它允许我们对集合、数组等数据源进行中间操作,获取最终结果。Stream本身并不存储数据,它只是提供一个流式处理的接口,通过中间操作链和终端操作来完成数据处理任务。
【特点】
- **A:Stream本身不存储任何元素**。Stream只是提供一个处理数据流的接口,不会存储数据源中的元素。- **B:Stream操作不影响数据源**。所有的中间操作都是对流进行操作,数据源保持不变。- **C:中间操作是惰性求值**。直到遇到终端操作,中间操作才会执行,避免了早期绑定(eager evaluation)的问题。【步骤】
1. **获取Stream对象**:通过数据源(如集合、数组、生成器等)获取Stream实例。2. **提供中间操作链**:对Stream进行一系列的中间操作,如筛选、映射、排序等。3. **执行终端操作**:将中间操作链连接起来,执行最终的操作,例如归约、收集、匹配等。【心得】
在使用Stream时,需要注意每一步操作返回的Stream类型,确保操作链的正确性。例如,map操作返回的是新的Stream对象,与原Stream无关。通过合理组合中间操作,可以实现复杂的数据处理逻辑。【示例】
User user = new User();user.setName("张三");User user1 = new User();user1.setName("李四");List list = new ArrayList<>();list.add(user);list.add(user1);List rList = list.stream().map(x -> x.getName()).collect(Collectors.toList());System.out.println(rList); 输出结果:[张三, 李四]
获取Stream对象的方法有多种,具体取决于数据源的类型。
【针对集合】
```javaList【针对数组】
```javaint[] arr = new int[10];IntStream stream2 = Arrays.stream(arr);```【针对数值】
```javaStream【无限流-迭代】
```javaStream【无限流-生成】
```javaStream中间操作是流式处理的核心,常见的操作包括筛选、映射、排序等。这些操作是惰性求值的,直到终端操作执行时才会处理中间操作。
【筛选与切片】
| 方法 | 描述 |
|---|---|
| filter(Predicate p) | 过滤流中的元素,保留符合条件的元素。 |
| distinct() | 去重,根据元素的hashCode()和equals()方法去除重复元素。 |
| limit(long n) | 限制流中元素的数量,不超过n个。 |
| skip(long n) | 跳过n个元素,返回剩下的流。 |
【映射】
| 方法 | 描述 |
|---|---|
| map(Function | 将流中的每个元素应用到Lambda函数,返回新的Stream。 |
| mapToInt(ToIntFunction | 将流中的元素映射为IntStream。 |
| flatMap(Function | 将流中的元素分解为多个Stream并连接起来。 |
【排序】
| 方法 | 描述 |
|---|---|
| sorted() | 按自然顺序排序,适用于实现Comparable的对象。 |
| sorted(Comparator com) | 根据自定义比较器进行排序。 |
终端操作是流式处理的最后一步,负责将中间操作的结果转换为最终的输出形式。常见的终端操作包括归约、收集、匹配等。
【归约(reduce)】
```javaList【收集(collect)】
```javaList【统计-counting】
```javaList【String/StringBuffer循环赋值】
```javapublic static void main(String[] args) { StringBuffer stringBuffer = new StringBuffer(); Stream转载地址:http://wstg.baihongyu.com/