Java Stream流式编程

1.概念

集合优化了对象的存储,二流(Streams)则是关于一组组对象的处理

流(Streams)是与任何特定存储机制无关的元素序列–实际上,我们说的流是"没有存储"的.

取代了集合中迭代元素的做法,使用流即可从管道中提取元素并对其操作,这些管道通常被串联在一起形成一整套的管线,来对流进行操作.

在大多数情况下,将对象存储在集合中就是为了处理它们,因此你会发现你把编程的主要焦点从集合转移到了流上

流的一个核心好处是,它使得程序更加短小并且更易理解,当Lambda表达式和方法引用(method feferences)和流一起使用的时候会让人感觉自成一体.流使得java8更具有吸引力

  1. 同时Stream不是一种数据结构,它只是某种数据源的一个视图,源可以是数组、文件、集合、函数、java容器或I/O通道(channel)等.在Stream中的操作每一次都会产生新的流,内部不会像普通集合操作一样立刻获取值,而是’惰性取值’,只有等到用户真正需要结果的时候才会执行

  2. 对于Stream流的可以把它当成工厂中的流水线,每个Stream流的操作过程遵循着创建–>操作–>获取结果的过程,就像流水线上的节点一样组成一个个链条

    除此之外你还可以把他理解成SQL的视图,集合就相当于数据表中的数据,获取Stream流的过程就是确定数据表的属性和元数据的过程,元数据的每一个元素就是表中的数据,对Stream流进行操作的过程就是通过SQL对这些数据进行查找、过滤、组合、计算、操作、分组等过程,获取结果就是SQL执行完毕之后获取的结果视图一样.

  3. 获取Stream流方法

    1. 单列集合

      List<String> list = new ArrayList<>();
      Stream<String> stream = list.stream();
      
    2. 双列集合

      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()));
          
    3. 数组

      • int[] arr = {1,2,3}
        IntStream stream = Arrays.stream(arr);
        stream.forEach(System.out::println);
        
    4. 同种类型的多个数据

      • Stream<Integer> stream = Stream.of(1,2,3,4,5)
        stream.forEach(System.out::println);
        
    5. 获取并行流(多线程)

      • List<String> list = Arrays.asList("a","b","c");
        Stream<String> parallelStream = list.parallelStream();
        
    6. 文件

      • Stream<String> lines = Files.lines(Paths.get("data.txt").Charset.defaultCharset());
        
    7. 通过函数

      • Stream提供了iterate和generate两个静态方法从函数中生成流

      • Stream<Integer> iterate = Stream.iterate(0,item->item+1);
        Stream<Double> generate = Stream.generate(Math::random);
        

2.Stream流的基本操作

  1. 中间操作

    中间操作的相关方法执行完成之后,会返回一个处理过后的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

  2. 终结操作

  3. 收集操作

3. Stream流在编程中主要体现了以下好处

  1. 处理大量数据:Stream流可以在不加载整个数据集的情况下处理大量数据,从而提高程序的效率。
  2. 数据处理的流畅性:Stream流可以持续不间断地处理数据,提高程序的流畅性。
  3. 编码简单:Stream流抽象了数据处理的过程,使得代码更简单易懂。
  4. 可组合:Stream流可以组合在一起,以实现复杂的数据处理任务。
  5. 可并行处理:Stream流可以并行处理,以加速数据处理速度。
  6. 可操作数据源:Stream流可以操作各种数据源,如文件、数组、列表等。
    Stream流为编程中的数据处理提供了更简单、更高效、更灵活的方法。

4. Stream流常用于以下场景:

  1. 文件读写:Stream流可以方便地读取文件内容,并且可以将读取的数据写入文件。
  2. 网络数据传输:Stream流可以通过网络传输数据,方便了跨平台的数据交换。
  3. 输入输出重定向:Stream流可以重定向标准输入输出,可以将程序的输出作为另一个程序的输入。
  4. 数据处理:Stream流可以通过链式调用,对数据进行过滤、转换、统计等处理。
  5. 压缩解压缩:Stream流可以方便地进行数据的压缩解压缩处理。
  6. 加密解密:Stream流可以对数据进行加密解密处理。
    Stream流是Java编程中常用的技术,它可以方便地对数据进行处理,是数据读写和处理的首选方案。

5. Stream流高效的原理主要在于以下几个方面:

  1. 缓存:Stream流通常会使用缓存来存储读取的数据,这样可以减少对数据源的频繁读取,提高读取效率。
  2. 分段读取:Stream流在读取数据时,一般不会一次性读取完所有数据,而是采用分段读取的方式,以提高读取效率。
  3. 对象复用:Stream流在进行数据读写和处理时,通常会对某些对象进行复用,这样可以减少对象的创建和销毁,降低内存消耗。
  4. 并行处理:Stream流支持并行处理,可以使用多个线程同时处理数据,以提高处理效率。
  5. 链式调用:Stream流采用链式调用的方式,可以方便地对数据进行处理,避免了多次读取数据的性能损失。
    Stream流高效的原理主要在于利用缓存、分段读取、对象复用、并行处理以及链式调用等技术来提高读写和处理效率。

6.Stream流的优势有以下几点:

  1. 高效:Stream流通过缓存、分段读取、对象复用、并行处理等技术,使得数据读写和处理效率得到大幅提升。
  2. 简便:Stream流支持链式调用,可以简化代码,方便开发人员对数据进行处理。
  3. 灵活:Stream流可以对数据进行多种处理,比如排序、筛选、转换等,为开发人员提供了更多的灵活性。
  4. 可扩展:Stream流可以通过组合多种操作来处理数据,为开发人员提供了更多的可扩展性。
  5. 安全:Stream流支持对数据进行加密、解密等安全操作,以保证数据的安全性。
    Stream流具有高效、简便、灵活、可扩展以及安全等优势,是一种非常有用的数据读写和处理方式。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

[微信紅包]恭喜发財,大吉大利!

你的鼓励将是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值