Stream API
- Java 8集合中的Stream相当于高级版的Iterator
- Stream API通过Lambda表达式对集合进行各种非常便利高效的聚合操作,或者大批量数据操作
- Stream的聚合操作与数据库SQL的聚合操作sorted、filter、map等非常类似
- 在数据操作方面,Stream不仅可以通过串行的方式实现数据操作,还可以通过并行的方式处理大批量数据,提高处理效率
// java.util.Collection
default Stream<E> stream() {
return StreamSupport.stream(spliterator(), false);
}
default Stream<E> parallelStream() {
return StreamSupport.stream(spliterator(), true);
}
@Data
class Student {
private Integer height;
private String sex;
}
Map<String, List<Student>> map = Maps.newHashMap();
List<Student> list = Lists.newArrayList();
// 传统的迭代方式
for (Student student : list) {
if (student.getHeight() > 160) {
String sex = student.getSex();
if (!map.containsKey(sex)) {
map.put(sex, Lists.newArrayList());
}
map.get(sex).add(student);
}
}
// Stream API,串行实现
map = list.stream().filter((Student s) -> s.getHeight() > 160).collect(Collectors.groupingBy(Student::getSex));
// Stream API,并行实现
map = list.parallelStream().filter((Student s) -> s.getHeight() > 160).collect(Collectors.groupingBy(Student::getSex));
优化遍历
Stream操作分类
- 分为两大类:中间操作(Intermediate operations)和终结操作(Terminal operations)
- 中间操作只对操作进行了记录,即只会返回一个流,不会进行计算操作,而终结操作是实现了计算操作
- 中间操作又分为无状态(Stateless)操作和有状态(Stateful)操作
- 无状态操作:元素的处理不受之前元素的影响
- 有状态操作:该操作只有拿到所有元素之后才能继续下去
- 终结操作又分为短路(Short-circuiting)操作与非短路(UnShort-circuiting)操作
- 短路操作:遇到某些符合条件的元素就可以得到最终结果
- 非短路操作:必须处理完所有元素才能得到最终结果
- 通常会将中间操作称为懒操作,正是因为懒操作结合终结操作,数据源构成的处理管道(Pipel