1 简介
-
Stream是Java8新增的流特性,目的是让程序员写出高效率、干净、简介的代码
-
Stream类似SQL语句,可以对代码进行集合运算和表达
-
Stream就是把元素看成一种流,流在管道中传输,并且可以在管道的节点上进行处理,比如筛选,排序,聚合等
-
数据源: 可以是集合、数组、I/O channel、 生成器generator 等。
-
流:分为串行流stream() 和 并行流parallelStream()
-
聚合操作:类似SQL一样, 常见的有 filter , map , reduce , find , match , sorted等。
2 Stream常用案例
2.1 串行流和并行流
// 表达式: 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.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)); }
运行结果
可以看到耗时两毫秒,内容按顺序输出
2.1.3 并行流
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)); }
2.2 聚合操作
2.2.1 filter过滤
过滤所有性别男的人
private static void testFilter() { personList.stream().filter(person -> person.getSex() == 1).forEach(person -> { System.out.println("男生 ->" + person.toString()); }); }
2.2.2 map抽取内容生成集合
取出对象集合中的姓名,并生成List集合
private static void testMap() { List<String> nameList = personList.stream().map(Person::getName).collect(Collectors.toList()); nameList.forEach(name ->{ System.out.println(name); }); }
2.2.3 sorted排序
按年龄进行排序
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()); }); }
2.2.4 limit限制查询条目数
查询两位人员数据
private static void testLimit() { personList.stream().limit(2).forEach(person -> { System.out.println(person.toString()); }); }
2.2.5 distinct去重
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); }); }
2.2.6 skip跳过元素
跳过前面4个人
private static void testSkip(){ personList.stream().skip(4).forEach(person -> { System.out.println(person.toString()); }); }
2.2.7 mapTo统计
统计人员的年龄情况
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()); }
2.2.8 collect规约操作
抽出人员名字,并以逗号分隔
private static void testCollect() { List<String> nameList = personList.stream().map(Person::getName).collect(Collectors.toList()); String names = nameList.stream().collect(Collectors.joining(",")); System.out.println("names ->" + names); }