博客
关于我
(java1.8)-Stream API 常用方法及例子
阅读量:373 次
发布时间:2019-03-05

本文共 2599 字,大约阅读时间需要 8 分钟。

3. Stream API

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);

输出结果:[张三, 李四]

4. 获取Stream对象

获取Stream对象的方法有多种,具体取决于数据源的类型。

【针对集合】

```javaList
l1 = new ArrayList<>();Stream
stream1 = l1.stream();```

【针对数组】

```javaint[] arr = new int[10];IntStream stream2 = Arrays.stream(arr);```

【针对数值】

```javaStream
stream4 = Stream.of("aa", "bb", "cc");```

【无限流-迭代】

```javaStream
stream5 = Stream.iterate(0, x -> x + 2);```

【无限流-生成】

```javaStream
stream6 = Stream.generate(() -> Math.random());```

5. 提供中间操作链

中间操作是流式处理的核心,常见的操作包括筛选、映射、排序等。这些操作是惰性求值的,直到终端操作执行时才会处理中间操作。

【筛选与切片】

方法 描述
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) 根据自定义比较器进行排序。

6. 终端操作

终端操作是流式处理的最后一步,负责将中间操作的结果转换为最终的输出形式。常见的终端操作包括归约、收集、匹配等。

【归约(reduce)】

```javaList
list = Arrays.asList(1, 2, 3, 4, 5, 6);Integer sum = list.stream().reduce(0, (x, y) -> x + y);System.out.println(sum);```

【收集(collect)】

```javaList
list = Arrays.asList(12, 34, 56, 45, 66, 66);List
coList = list.stream().filter(x -> x > 40).collect(Collectors.toList());System.out.println(coList); // 输出: [56, 45, 66, 66]```

【统计-counting】

```javaList
list = Arrays.asList(12, 34, 56, 45, 66, 66);Long count = list.stream().filter(x -> x > 40).collect(Collectors.counting());System.out.println(count); // 输出: 4```
7. 示例

【String/StringBuffer循环赋值】

```javapublic static void main(String[] args) { StringBuffer stringBuffer = new StringBuffer(); Stream
limit = Stream.generate(() -> stringBuffer.append("0")).limit(51); System.out.println(limit.count()); // 51 System.out.println(stringBuffer.toString()); // 拼接了51个0}```

转载地址:http://wstg.baihongyu.com/

你可能感兴趣的文章
Objective-C实现DisjointSet并查集的算法(附完整源码)
查看>>
Objective-C实现djb2哈希算法(附完整源码)
查看>>
Objective-C实现DNF排序算法(附完整源码)
查看>>
Objective-C实现double factorial iterative双阶乘迭代算法(附完整源码)
查看>>
Objective-C实现double factorial recursive双阶乘递归算法(附完整源码)
查看>>
Objective-C实现double hash双哈希算法(附完整源码)
查看>>
Objective-C实现double linear search recursion双线性搜索递归算法(附完整源码)
查看>>
Objective-C实现DoublyLinkedList双链表的算法(附完整源码)
查看>>
Objective-C实现DPLL(davisb putnamb logemannb loveland)算法(附完整源码)
查看>>
Objective-C实现Edmonds-Karp算法(附完整源码)
查看>>
Objective-C实现EEMD算法(附完整源码)
查看>>
Objective-C实现EM算法(附完整源码)
查看>>
Objective-C实现EM算法(附完整源码)
查看>>
Objective-C实现entropy熵算法(附完整源码)
查看>>
Objective-C实现euclidean distance欧式距离算法(附完整源码)
查看>>
Objective-C实现Euclidean GCD欧几里得最大公约数算法(附完整源码)
查看>>
Objective-C实现euclideanDistance欧氏距离算法(附完整源码)
查看>>
Objective-C实现euler method欧拉法算法(附完整源码)
查看>>
Objective-C实现eulerianPath欧拉路径算法(附完整源码)
查看>>
Objective-C实现eval函数功能(附完整源码)
查看>>