【jdk 1.8】Stream

【jdk 1.8】Stream

Stream 主要应用于 集合 运算中,集合在 java8 中拥有一个stream方法,可以得到一个流对象,这个对象拥有很多方法,这些方法可以很方便的对集合进行例如排序,分组,计数,遍历,转换等操作。

Java 8 API添加了一个新的抽象称为流Stream,可以让你以一种声明的方式处理数据。

Stream 使用一种类似用 SQL 语句从数据库查询数据的直观方式来提供一种对 Java 集合运算和表达的高阶抽象.
Stream API可以极大提高Java程序员的生产力,让程序员写出高效率、干净、简洁的代码.
这种风格将要处理的元素集合看作一种流,流在管道中传输, 并且可以在管道的节点上进行处理,比如筛选/排序/聚合等.
元素流在管道中经过中间操作(intermediate operation)的处理,最后由最终操作(terminal operation)得到前面处理的结果.

什么是 Stream ?

Stream(流)是一个来自数据源的元素队列并支持聚合操作

元素是特定类型的对象,形成一个队列.Java中的Stream并不会存储元素,而是按需计算
数据源 流的来源. 可以是集合,数组,I/O channel, 产生器generator 等.
聚合操作 类似SQL语句一样的操作, 比如filter, map, reduce, find, match, sorted等.
和以前的Collection操作不同, Stream操作还有两个基础的特征:

Pipelining: 中间操作都会返回流对象本身。 这样多个操作可以串联成一个管道, 如同流式风格(fluent style).这样做可以对操作进行优化, 比如延迟执行(laziness)和短路(short-circuiting).
内部迭代: 以前对集合遍历都是通过Iterator或者For-Each的方式, 显式的在集合外部进行迭代, 这叫做外部迭代. Stream提供了内部迭代的方式, 通过访问者模式(Visitor)实现.

生成流:

stream() − 为集合创建串行流

parallelStream() − 为集合创建并行流

流的几种用途:

forEach : 进一步简化 Lambda 的写法
map : 用于映射每个元素,可以做一些逻辑处理
fiter : 过滤,通过设置条件过滤数据
limit : 获取限制指定数量的流对象
sorted : 用于对 流 进行排序
parallel : 流的并行处理, 底层使用 Fork/Join 框架, 多线程异步任务

Collectors : 归约操作,比如:将流转换为集合 和 聚合元素
summaryStatistics:统计:获取最大\最小\平均数的操作,int long double等基本类型

forEach : limit 限制数量,sorted 升序排列,forEach 遍历(流的特殊写法)

// forEach + sorted
Random random = new Random();
random.ints().limit(3).sorted().forEach(System.out::println);
//

map : map 映射元素 + 逻辑处理,distinct 去除相同元素, collect 转换处理

// map
List<Integer> numbers = Arrays.asList(2, 4, 2);
List<Integer> sequenceList = numbers.stream().map(i -> i*i).distinct().collect(Collectors.toList());
sequenceList.forEach(System.out::println);
//

filter : filter 按条件过滤, collect 转换处理,joining 格式样式

// filter
String[] names = {"lay", "", "The shy"};
List<String> list = Arrays.asList(names);
String result = list.stream().filter(name -> !name.isEmpty()).collect(Collectors.joining(", "));
System.out.println(result);
//

parallel (并行):

// 获取空字符串的数量
List<String> strings = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl");
int count = strings.parallelStream().filter(string -> string.isEmpty()).count();
//

Collectors : 将流转换为 集合 和 聚合元素

Collectors.toList() : 返回 List 集合
Collectors.joining(", ") : 合并元素,格式化返回字符串

统计:统计结果的收集器,用于int、double、long等基本类型

// IntSummaryStatistics
List<Integer> numbers = Arrays.asList(3, 2, 2, 4, 5, 9, 1);
IntSummaryStatistics results = numbers.stream().mapToInt(i -> i).summaryStatistics();
		
System.out.println("最大数是:" + results.getMax());
System.out.println("最小数是:" + results.getMin());
System.out.println("平均数是:" + results.getAverage());
System.out.println("共和是:" + results.getSum());
System.out.println("个数:" + results.getCount());
//

关于Stream 的一些实例程序,后期后慢慢补充…..

0 0 vote
Article Rating
Subscribe
提醒
guest
0 评论
Inline Feedbacks
View all comments