流式计算

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

方式二:Stream的静态方法。

// Stream.of(...)
Stream<Integer> integerStream = Stream.of(1, 3, 5, 7, 9);
1
2

# 中间操作

过滤

// filter
persons.stream().filter(p -> p.getAge() > 18).forEach(System.out::println);
1
2

映射

// map
strings.stream().map(s -> s.toUpperCase()).forEach(System.out::println);
1
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

排序

// 自然排序
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

去重

strings.stream().distinct().forEach(System.out::println);
1

# 终止操作

迭代

// forEach
persons.stream().filter(p -> p.getAge() > 18).forEach(System.out::println);
1
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

# 参考资料

Java 8 Stream (opens new window)