版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u013379717/article/details/89639467
一、说明
Stream是以声明的方式将源数据的元素形成队列并执行一系列运算和表达的抽象,元素流在管道中经过中间操作(返回Stream本身)的处理,最后由终止操作(返回特定类型)得到前面处理的结果
Stream支持Collection的子类如List或者Set,不支持Map类型;Stream自身不会存储元素,也不会改变数据源对象,同时操作是惰性的,只有在终止操作执行后,所有的中间操作才会一次执行
二、示例
- 1、创建
// Stream 的 of() 静态方法
Stream<String> streamOf = Stream.of("aa", "bb", "cc");
// Stream 的 Builder 构建模式
Stream<Object> streamBuild = Stream.builder().add("aa").add("bb").add("cc").build();
// Arrays 的 stream() 静态方法
Stream<String> streamArrays = Arrays.stream(new String[] { "aa", "bb", "cc" });
// Collection 接口提供的 stream() 默认方法
Stream<String> streamCollection = new ArrayList<String>().stream();
// Stream 的 iterate() 方法 无限流 迭代运算 (起始值,运算逻辑)
Stream<Integer> streamIterate = Stream.iterate(0, (x) -> x + 2);
// Stream 的 generate() 方法 无限流 随机生成
Stream<Double> streamGenerate = Stream.generate(() -> Math.random());
- 2、迭代
// 标准
stus.stream().forEach(item -> System.out.println(item));
// 限量 使流中元素个数不超过指定数量
stus.stream().limit(3).forEach(item -> System.out.println(item));
// 跳过 跳过前n个元素,若流中元素不足则返回一个空流
stus.stream().skip(4).forEach(System.out::println);
// 去重 通过hashCode()和equals()方法,实体类需要重写
stus.stream().distinct().forEach(System.out::println);
// 过滤 通过条件过滤数据
stus.stream().filter(item -> item.getAge() > 18).forEach(System.out::println);
- 3、映射
// 映射 将对象转换为其他对象/形式或提取信息
stus.stream().map(item -> item.getClasses()).forEach(item -> System.out.println(item));
// 扁平映射 相较于map的将元素直接转换组成新的流,flatMap会将单个元素也转换成流再将元素的流合并成一个父的流
stus.stream().flatMap(item -> Arrays.stream(item.getName().split(""))).forEach(System.out::println);
- 4、排序
// 排序 默认,按照元素实现的Comparable中的compareo()方法,未实现将抛异常
stus.stream().map(Student::getName).sorted().forEach(System.out::println);
// 排序 自定义,实现Comparator接口的compare方法
stus.stream().sorted((c, n) -> c.getAge() - n.getAge()).forEach(System.out::println);
- 5、匹配
// 匹配 是否所有元素都匹配 断言
System.out.println(stus.stream().allMatch(item -> item.getAge() > 19));
// 匹配 是否至少有一个元素匹配
System.out.println(stus.stream().anyMatch(item -> item.getAge() > 19));
// 匹配 是否没有一个元素匹配
System.out.println(stus.stream().noneMatch(item -> item.getAge() > 19));
- 6、查找
// 查找 返回第一个元素
System.out.println(stus.stream().findFirst().get());
// 查找 返回任意一个元素
System.out.println(stus.stream().findAny().get());
- 7、最值
// 最大值对象 返回包含指定属性最大值元素的容器(取排序后最后一个,倒序的max实际为最小)
System.out.println(stus.stream().max((c, n) -> Integer.compare(c.getId(), n.getId())).get());
// 提取最大值 返回包含指定属性的最大值的容器
System.out.println(stus.stream().map(Student::getAge).max(Integer::compareTo).get());
// 最小值对象
System.out.println(stus.stream().min((c, n) -> Integer.compare(c.getAge(), n.getAge())).get());
- 8、合成
将流中的元素属性合成一个值
// 合成 字符串拼接
System.out.println(stus.stream().map(Student::getName).reduce("", (c, n) -> c + n));
// 合成 数字求和
System.out.println(stus.stream().map(Student::getAge).reduce(Integer::sum).get());
- 9、转换
将流中的元素汇总转换为其他形式,接收一个Collector接口的实现,工具类Collectors中提供了很多静态实现了Collector接口的方法
// 转换为List
stus.stream().collect(Collectors.toList());
// 统计数量
System.out.println("" + stus.stream().collect(Collectors.counting()));
// 统计数量
System.out.println(stus.stream().count());
// 求平均值
System.out.println("" + stus.stream().collect(Collectors.averagingDouble(Student::getAge)));
// 求和
System.out.println("" + stus.stream().collect(Collectors.summingInt(Student::getAge)));
// 求最大值
System.out.println("" + stus.stream().collect(Collectors.maxBy((a, b) -> Integer.compare(a.getAge(), b.getAge()))));
// 分组
System.out.println(stus.stream().collect(Collectors.groupingBy(Student::getOrigin)));
// 多级分组
System.out.println("" + stus.stream().collect(Collectors.groupingBy(Student::getAge, Collectors.groupingBy((stu) -> stu.getOrigin()))));
// 分区 按字符串长度分区
System.out.println(stus.stream().collect(Collectors.partitioningBy(item -> item.getAge() == 18)));
// 计算方法总括函数 summarizingType传入计算的属性,返回TypeSummaryStatistics实例,包含Average、Count、Max、Sum 等计算方法
stus.stream().collect(Collectors.summarizingInt(Student::getAge)).getAverage();
// 连接字符串 重载方法
stus.stream().map(Student::getName).collect(Collectors.joining());
// 自定义元素汇总转换的形式(自定义为Collectors没有静态实现的数据结构)
stus.stream().collect(Collectors.toCollection(HashSet::new));