Stream基本概念
- Stream流是来自数据源的元素队列并支持聚合操作:
- 元素: 是特定类型的对象,是数据源形成的一个队列.Java中的Stream不会存储元素,而是按需计算
- 数据源: Stream流数据的来源.可以是集合,数组,I/O Channel,产生器Generator等
- 聚合操作: 类似SQL语句的一系列操作,比如filter,map,reduce,match和sorted等
- Stream操作的两个基础特征:
- Pipelining: 中间操作都会返回流本身.多个操作可以串成一个管道.这样就可以对操作进行优化,比如延迟执行laziness和短路short-circuiting
- 内部迭代: 通常对集合的遍历都是通过Iterator或者forEach操作,显式地在集合外部进行迭代 .Stream提供了内部迭代的方式,通过访问者模式Visitor实现
- 示例: 将流程转化为Java代码
+--------------------+ +------+ +------+ +---+ +-------+
| stream of elements +-----> |filter+-> |sorted+-> |map+-> |collect|
+--------------------+ +------+ +------+ +---+ +-------+
List<Integer> transactionsIds = widgets.stream()
.filter(b -> b.getColor == RED)
.sorted((x, y) -> x.getWeight() - y.getWeight())
.mapToInt(Widget :: getWeight)
.sum();
生成流
- 集合接口有两种方法来生成流:
- stream(): 为集合创建串行流
- parallelStream(): 为集合创建并行流
List<String> strings = Arrays.asList("I", "want", "to", "be", "", "great");
List<String> filter = strings.stream().filter(string -> !string.isEmpty()).collect(Collectors.toList());
forEach
- Stream中使用forEach来迭代流中的每个数据
Random random = new Random();
random.ints().limit(10).forEach(System.out :: println);
map
List<Integer> numbers = Arrays.asList(2, 3, 5, 6, 6, 8);
List<Integer> squareNums = numbers.stream().map(i -> i * i).distinct().collect(Collectors.toList());
filter
List<String> strings = Arrays.asList("I", "want", "to", "be", "", "great");
long count = Strings.stream().filter(string -> string.isEmpty()).count();
limit
Random random = new Random();
random.ints().limit(10).forEach(System.out :: println);
sorted
Random random = new Random();
random.ints().limit(10).forEach(System.out :: println);
parallelStream
- parallelStream是流并行处理程序的代替方法
List<String> strings = Arrays.asList("I", "want", "to", "be", "", "great");
long count = strings.parallelStream().filter(string -> string.isEmpty()).count();
Collectors
- Collectors类实现很多归约操作,比如将流转换成集合和聚合元素
- Collectors可用于返回列表和字符串
List<String> strings = Arrays.asList("I", "want", "to", "be", "", "great");
List<String> filtered = strings.stream().filter(string -> !string.isEmpty()).collect(Collectors.toList());
String mergedString = strings.stream().filter(string -> !string.isEmpty()).collect(Collectors.joining(","));
统计
- 产生统计结果的收集器,主要用于int,double,long等类型
List<Integer> numbers = Arrays.asList(3, 2, 3, 7, 3, 5);
IntSummaryStatistics stats = numbers.stream().mapToInt((x) -> x).summaryStatistics();
System.out.println("列表中最大的数:" + stats.getMax());
System.out.println("列表中最小的数:" + stats.getMin());
System.out.println("所有数之和:" + stats.getSum());
System.out.println("平均数:" + stats.getAverage());