文章目录
1. 什么是Stream
- 1. 什么是Stream
- 2. Stream常用案例
- 2.1 串行流和并行流
- 2.1.1 串行流
- 2.1.3 并行流
- 2.2 聚合操作
- 2.2.1 filter 过滤
- 2.2.2 map 抽取内容生成集合
- 2.2.3 sorted 排序
- 2.2.4 limit 限制查询条目数
- 2.2.5 distinct 去重
- 2.2.6 skip 跳过元素
- 2.2.7 mapTo 统计
- 2.2.8 collect 规约操作
- 3. 结语
本文的代码已上传到Github,有兴趣的小伙伴可以下载看看:https://github.com/ylw-github/Java8-New-Feature
下面直观点了解Stream:
- Stream是Java8 新增的流特性,目的是让程序员写出高效率、干净、简洁的代码
- Stream类似于SQL语句,可以对代码进行集合运算和表达
- Stream就是把元素看成一种流,流在管道中传输, 并且可以在管道的节点上进行处理, 比如筛选, 排序,聚合等。
我把Stream使用格式整理成如下图: 图中的三个角色解释如下:
- 数据源: 可以是集合、数组、I/O channel、 生成器generator 等。
- 流:分为串行流stream() 和 并行流parallelStream()
- 聚合操作:类似SQL一样, 常见的有 filter , map , reduce , find , match , sorted等。
首先先初始化一些数据:
// 表达式:
personList.add(new Person(String name, Integer age, Integer sex));
// 初始化数据
personList.add(new Person("张三", 18, 1));
personList.add(new Person("李四", 20, 2));
personList.add(new Person("王五", 16, 2));
personList.add(new Person("赵六", 32, 1));
personList.add(new Person("陆七", 19, 1));
2.1 串行流和并行流
2.1.1 串行流
直接贴代码:
private static void testStream() {
long startTime = System.currentTimeMillis();
personList.stream().forEach(person -> {
System.out.println(person.toString());
});
System.out.println("stream consume time -> " + (System.currentTimeMillis() - startTime));
}
运行结果: 结论:可以看到耗时两毫秒,内容按顺序输出。
直接贴代码:
private static void testParallelStream() {
long startTime = System.currentTimeMillis();
personList.parallelStream().forEach(person -> {
System.out.println(person.toString());
});
System.out.println("parallelStream consume time -> " + (System.currentTimeMillis() - startTime));
}
运行结果: 结论:可以看到耗时19毫秒,内容无序输出,比串行流慢。
过滤所有性别男生
的人,代码如下:
private static void testFilter() {
personList.stream().filter(person -> person.getSex() == 1).forEach(person -> {
System.out.println("男生 ->" + person.toString());
});
}
运行结果:
取出对象集合中的姓名,并生成List集合,代码如下:
private static void testMap() {
List nameList = personList.stream().map(Person::getName).collect(Collectors.toList());
nameList.forEach(name ->{
System.out.println(name);
});
}
运行结果:
按年龄进行排序,代码如下:
private static void testSorted() {
System.out.println("------ 按年龄升序排序 ------");
personList.stream().sorted(Comparator.comparing(Person::getAge)).forEach(person -> {
System.out.println(person.toString());
});
System.out.println("------ 按年龄降序排序 ------");
personList.stream().sorted(Comparator.comparing(Person::getAge).reversed()).forEach(person -> {
System.out.println(person.toString());
});
}
运行结果:
查询两位人员数据,代码如下:
private static void testLimit() {
personList.stream().limit(2).forEach(person -> {
System.out.println(person.toString());
});
}
运行结果:
代码如下:
private static void testDistinct() {
int[] ints = {1, 1, 2, 2, 3, 3, 3, 4, 4, 4, 4};
Arrays.stream(ints).distinct().forEach(number -> {
System.out.println("number ->" + number);
});
}
运行结果:
跳过前面4个人,代码如下:
private static void testSkip(){
personList.stream().skip(4).forEach(person -> {
System.out.println(person.toString());
});
}
运行结果:
统计人员的年龄情况,代码如下:
private static void testMapTo() {
IntSummaryStatistics intSummaryStatistics = personList.stream().mapToInt(Person::getAge).summaryStatistics();
System.out.println("总条目数 ——> "+intSummaryStatistics.getCount());
System.out.println("总年龄 ——>"+intSummaryStatistics.getSum());
System.out.println("最大年龄 ——>"+intSummaryStatistics.getMax());
System.out.println("最小年龄 ——>"+intSummaryStatistics.getMin());
System.out.println("平均年龄 ——>"+intSummaryStatistics.getAverage());
}
运行结果:
抽出人员名字,并以逗号分隔,代码如下:
private static void testCollect() {
List nameList = personList.stream().map(Person::getName).collect(Collectors.toList());
String names = nameList.stream().collect(Collectors.joining(","));
System.out.println("names ->" + names);
}
运行结果:
stream除了本文写的,还有很多的操作,在此不再赘述,有兴趣的童鞋可以去参考官方的API:https://www.oracle.com/java/technologies/javase/8-whats-new.html