流式计算
maiaimei 2021/3/7 Java
Java8特性,Stream流式计算是对集合Collection对象功能的增强,它专注于对集合对象进行聚合操作或者大批量数据操作。
集合Collection,是一种静态的内存数据结构,面向内存,存储在内存中。
流Stream,是有关计算的,面向CPU,通过CPU实现计算。
流Stream,它自己不会存储元素。
流Stream,不会改变源对象。相反,它们会返回一个持有结果的新Stream。
流Stream,操作是延迟执行的。一旦执行终止操作,就执行中间操作链,并产生结果。之后,它不能再被使用。
# 创建流
方式一:集合接口的方法。
- stream() − 为集合创建串行流。
- parallelStream() − 为集合创建并行流。
// stream()
Stream<Person> stream = persons.stream();
1
2
2
方式二:Stream的静态方法。
// Stream.of(...)
Stream<Integer> integerStream = Stream.of(1, 3, 5, 7, 9);
1
2
2
# 中间操作
过滤
// filter
persons.stream().filter(p -> p.getAge() > 18).forEach(System.out::println);
1
2
2
映射
// map
strings.stream().map(s -> s.toUpperCase()).forEach(System.out::println);
1
2
2
截取
// limit 取前N个元素
persons.stream().limit(2).forEach(System.out::println);
// skip 跳过前N个元素
persons.stream().skip(2).forEach(System.out::println);
1
2
3
4
2
3
4
排序
// 自然排序
strings.stream().sorted().forEach(System.out::println);
// 定制排序
persons.stream().sorted((p1,p2)->Integer.compare(p1.getAge(),p2.getAge())).forEach(System.out::println);
1
2
3
4
2
3
4
去重
strings.stream().distinct().forEach(System.out::println);
1
# 终止操作
迭代
// forEach
persons.stream().filter(p -> p.getAge() > 18).forEach(System.out::println);
1
2
2
计数
persons.stream().filter(p -> p.getAge() > 18).count();
1
Collectors
Collectors 类实现了很多归约操作,例如将流转换成集合和聚合元素。
persons.stream().filter(p -> p.getAge() > 18).collect(Collectors.toList());
List<String> stringList = Arrays.asList("hello","world");
System.out.println(stringList.stream().collect(Collectors.joining(",")));
1
2
3
4
2
3
4