Java Stream流式编程
1.概念
集合优化了对象的存储,二流(Streams)则是关于一组组对象的处理
流(Streams)是与任何特定存储机制无关的元素序列–实际上,我们说的流是"没有存储"的.
取代了集合中迭代元素的做法,使用流即可从管道中提取元素并对其操作,这些管道通常被串联在一起形成一整套的管线,来对流进行操作.
在大多数情况下,将对象存储在集合中就是为了处理它们,因此你会发现你把编程的主要焦点从集合转移到了流上
流的一个核心好处是,它使得程序更加短小并且更易理解,当Lambda表达式和方法引用(method feferences)和流一起使用的时候会让人感觉自成一体.流使得java8更具有吸引力
-
同时Stream不是一种数据结构,它只是某种数据源的一个视图,源可以是数组、文件、集合、函数、java容器或I/O通道(channel)等.在Stream中的操作每一次都会产生新的流,内部不会像普通集合操作一样立刻获取值,而是’惰性取值’,只有等到用户真正需要结果的时候才会执行
-
对于Stream流的可以把它当成工厂中的流水线,每个Stream流的操作过程遵循着创建–>操作–>获取结果的过程,就像流水线上的节点一样组成一个个链条
除此之外你还可以把他理解成SQL的视图,集合就相当于数据表中的数据,获取Stream流的过程就是确定数据表的属性和元数据的过程,元数据的每一个元素就是表中的数据,对Stream流进行操作的过程就是通过SQL对这些数据进行查找、过滤、组合、计算、操作、分组等过程,获取结果就是SQL执行完毕之后获取的结果视图一样.
-
获取Stream流方法
-
单列集合
List<String> list = new ArrayList<>(); Stream<String> stream = list.stream();
-
双列集合
HashMap<String,Integer> map = new HashMap<>();
-
使用keyset
-
先获取到所有的键,再把这个set集合中所有的键放到stream流中
-
Stream<String> stream = map.keySet().stream(); stream.forEach(key->System.out.println(key+"="+map.get(key)))
-
-
使用entrySet
-
先获取到所有的键值对对象,再把这个set集合中所有的键值对对象放到stream
-
Stream<Map.Entr<String,Integer>> stream = map.entrySet().stream(); stream.forEach(item->System.out.println(item.getKey()+"-"+item.getValue()));
-
-
-
数组
-
int[] arr = {1,2,3} IntStream stream = Arrays.stream(arr); stream.forEach(System.out::println);
-
-
同种类型的多个数据
-
Stream<Integer> stream = Stream.of(1,2,3,4,5) stream.forEach(System.out::println);
-
-
获取并行流(多线程)
-
List<String> list = Arrays.asList("a","b","c"); Stream<String> parallelStream = list.parallelStream();
-
-
文件
-
Stream<String> lines = Files.lines(Paths.get("data.txt").Charset.defaultCharset());
-
-
通过函数
-
Stream提供了iterate和generate两个静态方法从函数中生成流
-
Stream<Integer> iterate = Stream.iterate(0,item->item+1); Stream<Double> generate = Stream.generate(Math::random);
-
-
2.Stream流的基本操作
-
中间操作
中间操作的相关方法执行完成之后,会返回一个处理过后的Stream流,这样依然可以继续执行其他流操作,形成一定的链式编程
-
Filter
对流中的数据就行过滤、筛选
-
List<Integer> list = Arrays.asList(6,7,8,9,10); Stream<Integer> stream = list.stream().filter(item -> item > 8);
-
Distinct
-
//普通数字集合去重 List<Integer> list = Arrays.asList(6,7,8,9,10); Stream<Integer> stream = list.stream().distinct();
-
Limit
-
List<Integer> list = Arrays.asList(6,7,8,9,10); Stream<Integer> stream = list.stream().limit(2);
-
Skip
-
List<Integer> list = Arrays.asList(6,7,8,9,10); Stream<Integer> stream = list.stream().skip(3);
-
Concat
-
List<Integer> list1 = Arrays.asList(1,2,3,4,5); List<Integer> list2 = Arrays.asList(6,7,8,9,10); Stream<Integer> concat = Stream.concat(list1.stream(),list2.stream());
-
Map
-
List<String> stringList = Arrays.asList("lambda","stream"); Stream<Integer> stream = stringList.stream().map(item -> item.length());
-
Flamap
-
allMatch
-
anyMatch
-
noneMatch
-
-
终结操作
-
收集操作
3. Stream流在编程中主要体现了以下好处
- 处理大量数据:Stream流可以在不加载整个数据集的情况下处理大量数据,从而提高程序的效率。
- 数据处理的流畅性:Stream流可以持续不间断地处理数据,提高程序的流畅性。
- 编码简单:Stream流抽象了数据处理的过程,使得代码更简单易懂。
- 可组合:Stream流可以组合在一起,以实现复杂的数据处理任务。
- 可并行处理:Stream流可以并行处理,以加速数据处理速度。
- 可操作数据源:Stream流可以操作各种数据源,如文件、数组、列表等。
Stream流为编程中的数据处理提供了更简单、更高效、更灵活的方法。
4. Stream流常用于以下场景:
- 文件读写:Stream流可以方便地读取文件内容,并且可以将读取的数据写入文件。
- 网络数据传输:Stream流可以通过网络传输数据,方便了跨平台的数据交换。
- 输入输出重定向:Stream流可以重定向标准输入输出,可以将程序的输出作为另一个程序的输入。
- 数据处理:Stream流可以通过链式调用,对数据进行过滤、转换、统计等处理。
- 压缩解压缩:Stream流可以方便地进行数据的压缩解压缩处理。
- 加密解密:Stream流可以对数据进行加密解密处理。
Stream流是Java编程中常用的技术,它可以方便地对数据进行处理,是数据读写和处理的首选方案。
5. Stream流高效的原理主要在于以下几个方面:
- 缓存:Stream流通常会使用缓存来存储读取的数据,这样可以减少对数据源的频繁读取,提高读取效率。
- 分段读取:Stream流在读取数据时,一般不会一次性读取完所有数据,而是采用分段读取的方式,以提高读取效率。
- 对象复用:Stream流在进行数据读写和处理时,通常会对某些对象进行复用,这样可以减少对象的创建和销毁,降低内存消耗。
- 并行处理:Stream流支持并行处理,可以使用多个线程同时处理数据,以提高处理效率。
- 链式调用:Stream流采用链式调用的方式,可以方便地对数据进行处理,避免了多次读取数据的性能损失。
Stream流高效的原理主要在于利用缓存、分段读取、对象复用、并行处理以及链式调用等技术来提高读写和处理效率。
6.Stream流的优势有以下几点:
- 高效:Stream流通过缓存、分段读取、对象复用、并行处理等技术,使得数据读写和处理效率得到大幅提升。
- 简便:Stream流支持链式调用,可以简化代码,方便开发人员对数据进行处理。
- 灵活:Stream流可以对数据进行多种处理,比如排序、筛选、转换等,为开发人员提供了更多的灵活性。
- 可扩展:Stream流可以通过组合多种操作来处理数据,为开发人员提供了更多的可扩展性。
- 安全:Stream流支持对数据进行加密、解密等安全操作,以保证数据的安全性。
Stream流具有高效、简便、灵活、可扩展以及安全等优势,是一种非常有用的数据读写和处理方式。