Stream用法和特点
stream是java8中处理集合的关键抽象概念,可对集合进行操作
特点::
无存储。Stream 不是一种数据结构,它只是某种数据源的一个视图,数据源可以是一 个数组,Java 容器或 I/O channel 等。
为函数式编程而生。对 Stream 的任何修改都不会修改背后的数据源,比如对 Stream 执行过滤操作并不会删除被过滤的元素,而是会产生一个不包含被过滤元素 的新 Stream。
惰式执行。Stream 上的操作并不会立即执行,只有等到用户真正需要结果的时候才会 执行。
可消费性。Stream 只能被“消费”一次,一旦遍历过就会失效,就像容器的迭代器那 样,想要再次遍历必须重新生成
总结
1.不是数据结构,不会储存数据
2.不会修改数据源,而是将操作的数据保存到另一个对象
3.惰性执行,操作不会立即执行,等用户真正需要结果才会执行
流的操作(创建、中间操作、最终操作)
创建:通过已有集合类的Stream或Stream的of方法
中间操作:过滤(filter)、转换(map)、排序(sort)、保留元素(limit/skip)、去重(distinct)
最终操作:collect(转换成集合)、count(计数)、forEach(遍历)
直接上代码
//创建一个Stream流
Stream<String> stream = Stream.of("张三", "","李四", "王五","");
//方法2
List<String> list = Arrays.asList("张三", "", "李四", "王五", "");
Stream<String> stream2 = list.stream();
//filter过滤字符串
//stream.filter(String ->!String.isEmpty()).forEach(System.out::println);
//collect 归约操作,可以接受各种做法作为参数,将流中的元素累积成一个汇总结果
List<String> asList = Arrays.asList("张三", "", "李四", "王五", "张三","王五Hello");
//输出开头带有 王五 的元素
asList = asList.stream().filter(string ->string.startsWith("王五")).collect(Collectors.toList());
System.out.println(asList);
//List<Integer> num = Arrays.asList(1, 1, 4, 4, 2, 2, 5, 5, 8);
//count 统计元素个数
//System.out.println(num.stream().count());
//映射每个元素对应的结果
//num.stream().map(i->i*i).forEach(System.out::println);
//获取前四个元素
//num.stream().limit(4).forEach(System.out::println);
//跳过前四个元素
//num.stream().skip(4).forEach(System.out::println);
//排序
//num.stream().sorted().forEach(System.out::println);
//去重
//num.stream().distinct().forEach(System.out::println);