一、概述
Stream 是 Java8 中处理集合的关键抽象概念,它可以指定你希望对集合进行的操作,可以执行非常复杂的查找、过滤和映射数据等操作。使用Stream API 对集合数据进行操作,就类似于使用 SQL 执行的数据库查询。也可以使用 Stream API来并行执行操作。简而言之,Stream API 提供了一种高效且易于使用的处理数据的方式。
特点:
- 元素是特定类型的对象,形成一个队列。 Java中的Stream并不会存储元素,而是按需计算。
- 数据源 流的来源。 可以是集合,数组,I/O channel, 产生器generator 等。
- 聚合操作 类似SQL语句一样的操作, 比如filter, map, reduce, find, match, sorted等。
- Pipelining: 中间操作都会返回流对象本身。 这样多个操作可以串联成一个管道, 如同流式风格(fluent style)。 这样做可以对操作进行优化, 比如延迟执行(laziness)和短路( short-circuiting)。
- 内部迭代: 以前对集合遍历都是通过Iterator或者For-Each的方式, 显式的在集合外部进行迭代, 这叫做外部迭代。 Stream提供了内部迭代的方式, 通过访问者模式(Visitor)实现。
二、Stream的创建
Stream可以通过集合数组创建。
1、通过 java.util.Collection.stream() 方法用集合创建流
List list = Arrays.asList(1, 2, 3);
// 创建一个顺序流
Stream stream = list.stream();
// 创建一个并行流
Stream parallelStream = list.parallelStream();
2、使用java.util.Arrays.stream(T[] array)方法用数组创建流
int[] array={1,3,5,6,8};
IntStream stream = Arrays.stream(array);
3、使用Stream的静态方法:of()、iterate()、generate()(我不是很常用)
Stream stream = Stream.of(1, 2, 3);
// of内部的方法,等同于使用数组创建流
@SafeVarargs
@SuppressWarnings("varargs") // Creating a stream from an array is safe
public static Stream of(T... values) {
return Arrays.stream(values);
}
Stream stream2 = Stream.iterate(0, (x) -> x + 3).limit(4);
stream2.forEach(System.out::print);
System.out.println();
Stream stream3 = Stream.generate(Math::random).limit(3);
stream3.forEach(System.out::println);
输出结果:
0369
0.4918954920054893
0.8246638264369555
0.17880449237798712
将对象集合转成对象中某个属性的集合
List list = new ArrayList<>();
List ids = list.stream().map(ReviewerRest::getId).collect(Collectors.toList());
复制代码
将某个属性的集合转成对象集合
List ids = new ArrayList<>();
List list = ids.stream().map(id -> {
ReviewerRest rest = new ReviewerRest();
rest.setRest(1);
rest.setDate(LocalDate.now());
rest.setReviewerId(1000L);
return rest;
}).collect(Collectors.toList());
复制代码
判断集合中是否有一个对象包含某个属性
boolean exist = list.stream().anyMatch(rest -> rest.getReviewerId().equals(1000L));
//...... allMatch 和 anyMatch 类似
复制代码
对集合中某个对象的属性求和
BigDecimal reduce = list.stream().map(ReviewerRest::getPrice).reduce(BigDecimal.ZERO, BigDecimal::add);
复制代码
集合转 Map (普通)
Map map = list.stream().collect(Collectors.toMap(ReviewerRest::getId, x -> x));
复制代码