Java8新特性Stream
Stream
什么是stream流
Stream(流)是一个来自数据源的元素队列,在管道中传输,支持聚合操作,也可以在管道的节点上进行处理(筛选,排序,聚合等)。可以把它理解为集合的一种抽象形式,将集合转换为流,会提供一种固定的顺序来处理集合元素。
流可以做到:
- 支持链式操作:允许通过链式调用多个方法对元素进行处理,使代码更具可读性,更易维护
- 延迟执行:只有在需要结果时才会触发实际计算,这种延迟执行可以提高性能,避免不必要的计算
- 函数式编程:提倡函数式编程的思想,提供了丰富的中间操作(过滤,排序等)和终端操作(收集,计数等)
- 并行处理:流框架支持并行流,更加方便的将流操作并行化
- 简化代码:减少循环时的条件判断与临时变量,提高代码表达力和可读性
stream与遍历的区别
- 遍历:
- 遍历是指通过循环逐个访问集合中的元素。
- 遍历需要显式地编写循环代码来处理集合元素。
- 遍历通常会暴露底层数据结构,使得代码的可读性和维护性较差。
- 遍历过程中,开发人员需要手动管理迭代器或索引来访问集合元素。
- 流:
- 流是一种更高级、更函数式的数据处理方式,提供了丰富的操作方法来处理集合元素。
- 流操作是基于管道模式的,可以通过链式操作来处理集合中的元素。
- 流隐藏了底层数据结构和迭代过程,使得代码更加简洁和易读。
- 流支持并行处理,可以利用多核处理器来提高处理效率。
- 流提供了丰富的中间操作(如过滤、映射、排序)和终端操作(如归约、收集),能够更灵活地对集合进行处理。
stream常用方法
forEach – 遍历
public static void main(String[] args) {
List<String> strList = Arrays.asList("a", "b", "c");
// 转换为stream流后进行遍历
strList.stream().forEach(System.out::print);
// 集合框架自带的遍历方法(相同效果)
strList.forEach(System.out::println);
}
// 输出
abc
map – 条件
public static void main(String[] args) {
List<String> strList = Arrays.asList("a", "b", "c");
// 对每一个对象都进行判断,遍历输出
strList.stream().map(s -> s.equals("a")).forEach(System.out::println);
}
//输出
true
false
false
filter – 过滤
public static void main(String[] args) {
List<String> strList = Arrays.asList("a", "b", "c");
//对不符合filter中条件的数据进行过滤
strList.stream().filter(s -> !s.equals("a")).forEach(System.out::print);
}
//输出
bc
limit – 限量
public static void main(String[] args) {
List<String> strList = Arrays.asList("a", "b", "c", "d", "e");
//返回limit(num)中的num个数的对象
strList.stream().filter(s -> !s.equals("a")).limit(3).forEach(System.out::print);
}
//输出
bcd
skip – 跳过
public static void main(String[] args) {
List<String> strList = Arrays.asList("a", "b", "c", "d", "e");
//直接跳过两个对象
strList.stream().skip(2).forEach(System.out::print);
System.out.println();
//筛选后跳过两个对象
strList.stream().filter(s -> !s.equals("a")).skip(2).forEach(System.out::print);
}
//输出
cde
de
distinct – 去重
public static void main(String[] args) {
List<String> strList = Arrays.asList("a", "b", "c", "a", "c", "c", "d", "e");
//去除重复对象
strList.stream().distinct().forEach(System.out::print);
}
//输出
abcde
sorted – 排序
public static void main(String[] args) {
List<String> strList = Arrays.asList("a", "b", "c", "a", "c", "c", "d", "e");
//默认升序排序
strList.stream().sorted().forEach(System.out::print);
}
//输出
aabcccde
sorted(Comparator com) – 依据判断排序
public static void main(String[] args) {
List<String> strList = Arrays.asList("a", "b", "c", "a", "c", "c", "d", "e");
//判断排序函数
strList.stream().sorted((s1, s2) -> s2.compareTo(s1)).forEach(System.out::print);
}
//输出
edcccbaa
Collectors – 恒等处理
public static void main(String[] args) {
List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "David");
List<String> sortedNames = names.stream()
.collect(Collectors.toList());
// 输出排序后的结果
System.out.println("Sorted names: " + sortedNames);
}
//输出
Sorted names: [Alice, Bob, Charlie, David]
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 IT蛋的个人博客!