Java - Stream流详解

这篇具有很好参考价值的文章主要介绍了Java - Stream流详解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

前言

一、Stream流是什么?

二、流的分类

顺序流

并行流

区别

三.获取流的常用方式

1.通过集合获取流

2.通过数组获取流

3.通过Stream.of()方法获取流

四.常用方法用法

1.filter(Predicate predicate):过滤流中的元素,只保留符合条件的元素

2.limit  &&  skip

 3.distinct():去重,去除流中重复的元素。

 4.concat 合并a和b两个流为一个流

5. map(Function mapper):将流中的元素按照指定的方式进行映射,返回一个新的流,>

 6.forEach(Consumer action):对流中的每个元素执行指定的操作。

7.collect(Collector collector):将流中的元素收集到一个集合中。,>

 5.练习



前言

大家好,好久不见了,最近由于实训的影响导致拖更了,在更新这一次估计javaSE基本上就算是完结了,还有一些落下的后面也会补上的,下次见面就是数据结构了Java - Stream流详解

尽情期待吧!那么就让我们步入Stream流的学习吧! 

Java - Stream流详解


一、Stream流是什么?

Stream流是Java 8中的一个新特性,它提供了一种处理集合和数组的方式。Stream流可以让我们以一种更加简洁、高效、可读性更强的方式来处理数据。Stream流可以用于过滤、映射、排序、聚合等操作,它可以让我们避免使用循环和条件语句来处理数据,从而让代码更加简洁易懂。Stream流的操作可以分为中间操作和终止操作两种类型,中间操作返回的是一个新的Stream流,终止操作返回的是一个非Stream类型的结果。Stream流的处理是惰性求值的,只有在执行终止操作时才会开始处理数据。

流(Stream)是一种基于支持一次性处理数据的数据源的元素序列,流只能使用一次。

流的设计初衷是为了支持函数式编程,它的目的是将数据处理和数据存储分离开来,使得数据处理更加灵活和高效。因此,流的元素只是在流中传递的临时数据,它们并不是永久存储在内存中的数据。当流的元素被消费后,它们就会被释放,不能再次使用.

如果需要对同一个数据集进行多次不同的操作,可以使用流的中间操作方法来构建多个流管道,每个流管道都可以对流进行不同的操作,并返回一个新的流。这样就可以对同一个数据集进行多次操作,而不需要重新获取数据集。

二、流的分类

顺序流

顺序流是一种单线程的流,它按照数据流的顺序依次处理每个元素,每个元素的处理都必须等待上一个元素的处理完成才能开始。

并行流

并行流是一种多线程的流,它可以将数据分成多个部分并行处理,每个部分都可以在不同的线程中处理,从而提高处理效率。

使用顺序流可以保证数据处理的顺序和一致性,适用于处理数据量较小的情况。而使用并行流可以提高数据处理的速度,适用于处理数据量较大、处理时间较长的情况。但是并行流也有一些缺点,比如线程之间的通信和同步会带来额外的开销,而且并行流可能会影响数据的顺序和一致性。因此在使用并行流时需要注意线程安全和数据一致性等问题。

区别

顺序流和并行流的区别在于它们的处理方式不同,顺序流是单线程的,而并行流是多线程的。使用的方法也有一些区别,例如:

  1. 获取顺序流:可以使用集合类的stream()方法、Arrays类的stream()方法、Stream类的of()方法、Stream类的iterate()方法、Stream类的generate()方法、Files类的lines()方法等来获取顺序流。

  2. 获取并行流:可以使用集合类的parallelStream()方法、Stream类的of()方法的parallel()方法、Stream类的iterate()方法的parallel()方法、Stream类的generate()方法的parallel()方法等来获取并行流。

除此之外,顺序流和并行流的使用方法基本相同,例如可以使用map()、filter()、reduce()等方法对流进行操作。但需要注意的是,在使用并行流时需要考虑线程安全和数据一致性等问题。

下面我只会详细讲解顺序流的使用,并行流的使用大差不差,大家有兴趣可以自行尝试

三.获取流的常用方式

前面提到过,流(Stream)是一种基于支持一次性处理数据的数据源的元素序列,流只能使用一次

所以将流保存起来没有任何意义,但是获取还是很有必要的,下面我会将常用的获取方式详解,不常用的也会给出获取方式,大家有兴趣的话可以自行尝试!

对了,我觉得有必要的是因为我现在的知识面不广,接触不到太复杂的内容,等回头成了大牛再来补

哈哈,其实不说的大部分是我不会,小黑子,漏出鸡脚了吧

Java - Stream流详解

1.通过集合获取流:可以使用集合类中的stream()方法或parallelStream()方法来获取流

2.通过数组获取流:可以使用Arrays类中的stream()方法来获取流。

3.通过Stream.of()方法获取流:可以使用Stream类中的of()方法来获取流。

4.通过Stream.iterate()方法获取流:可以使用Stream类中的iterate()方法来获取流

Stream<Integer> stream = Stream.iterate(0, n -> n + 2).limit(5); // 获取顺序流

5.通过Stream.generate()方法获取流:可以使用Stream类中的generate()方法来获取流

Stream<Double> stream = Stream.generate(Math::random).limit(5); // 获取顺序流

 6.通过Files.lines()方法获取流:可以使用Files类中的lines()方法来获取流。

Stream<String> stream = Files.lines(Paths.get("file.txt")); // 获取顺序流

1.通过集合获取流

Java - Stream流详解

 可变参数不懂得详见http://t.csdn.cn/SSp8u

 源码

Java - Stream流详解

 Java - Stream流详解

 刚才看了一下,有点麻烦,先欠着吧Java - Stream流详解

大家暂时知道获取的这个方法就行了

2.通过数组获取流

Java - Stream流详解

 源码

Java - Stream流详解

3.通过Stream.of()方法获取流

Java - Stream流详解

 Java - Stream流详解

四.常用方法用法

  1. filter(Predicate<T> predicate):过滤流中的元素,只保留符合条件的元素。
  2. map(Function<T, R> mapper):将流中的元素按照指定的方式进行映射,返回一个新的流。
  3. flatMap(Function<T, Stream<R>> mapper):将流中的元素按照指定的方式进行映射,然后将所有映射结果合并成一个流。
  4. limit(long maxSize):截取流中的前maxSize个元素。
  5. skip(long n):跳过流中的前n个元素。
  6. sorted():对流中的元素进行排序。
  7. distinct():去重,去除流中重复的元素。
  8. forEach(Consumer<T> action):对流中的每个元素执行指定的操作。
  9. reduce(T identity, BinaryOperator<T> accumulator):将流中的元素按照指定的方式进行累加,返回一个Optional对象。
  10. collect(Collector<T, A, R> collector):将流中的元素收集到一个集合中。
  11. concat 合并a和b两个流为一个流

标红的不会进行讲解,有的是在我能力范围之外,当然了有两个,哈哈,主要是懒,不想了解

值得一提的是第六个排序好像可以指定排序规则,我去试试哈

Java - Stream流详解

确实可以哈

大家有兴趣可以试试,关于排序我之前的博文讲解的已经很透彻了,不再赘述

下面我只会简单演示一下,想要掌握的自己可以去练一下哈,到最后我会附上练习题和答案

1.filter(Predicate<T> predicate):过滤流中的元素,只保留符合条件的元素

Java - Stream流详解

2.limit  &&  skip

Java - Stream流详解

 3.distinct():去重,去除流中重复的元素。

Java - Stream流详解

 4.concat 合并a和b两个流为一个流

Java - Stream流详解

5. map(Function<T, R> mapper):将流中的元素按照指定的方式进行映射,返回一个新的流

Java - Stream流详解

 突然想到这个问题了,解释一下Java - Stream流详解

 6.forEach(Consumer<T> action):对流中的每个元素执行指定的操作。

 就目前来看,我用的最多的是遍历

大家只要掌握遍历即可

Java - Stream流详解

7.collect(Collector<T, A, R> collector):将流中的元素收集到一个集合中。

Java - Stream流详解

 Java - Stream流详解

 5.练习

0,过滤奇数,只留下偶数

ArrayList<Integer> list = new ArrayList<>();
Collections.addAll(list,1,2,3,4,5,6,7,8,9,10);

1,男演员只要名字为3个字的前两人
2,女演员只要姓杨的,并且不要第一个
3,把过滤后的男演员姓名和女演员姓名合并到一起
4,将上一步的演员信息封装成Actor对象。
5,将所有的演员对象都保存到List集合中。

备注:演员类Actor,属性有:name,age
男演员:  "蔡坤坤,24" , "叶齁咸,23", "刘不甜,22", "吴签,24", "谷嘉,30", "肖梁梁,27"
女演员:  "赵小颖,35" , "杨颖,36", "高元元,43", "张天天,31", "刘诗,35", "杨小幂,33"
        ArrayList<String> list1 = new ArrayList<>();
        ArrayList<String> list2 = new ArrayList<>();

        Collections.addAll(list1,"蔡坤坤,24" , "叶齁咸,23", "刘不甜,22", "吴签,24", "谷嘉,30", "肖梁梁,27");
        Collections.addAll(list2,"赵小颖,35" , "杨颖,36", "高元元,43", "张天天,31", "刘诗,35", "杨小幂,33");

        ArrayList<Integer> list = new ArrayList<>();
        Collections.addAll(list,1,2,3,4,5,6,7,8,9,10);

        // 0, 过滤奇数,只留下偶数

        List<Integer> collect = list.stream().filter(integer -> integer % 2 == 0).collect(Collectors.toList());

        System.out.println(collect);

        // 1,男演员只要名字为3个字的前两人

        Stream<String> stream1 = list1.stream().filter(s -> s.split(",")[0].length() == 3).limit(2);

        //  2,女演员只要姓杨的,并且不要第一个

        Stream<String> stream2 = list2.stream().filter(s -> s.startsWith("杨")).skip(1);

        // 3,把过滤后的男演员姓名和女演员姓名合并到一起

        //Stream.concat(stream1,stream2).forEach(s-> System.out.println(s));

        // 4,将上一步的演员信息封装成Actor 对象

        // 类型转换 String-> Actor
        Stream.concat(stream1, stream2).map(new Function<String, Actor>() {
            @Override
            public Actor apply(String s) {
                Actor actor = new Actor();

                actor.setName(s.split(",")[0]);

                actor.setAge(Integer.parseInt(s.split(",")[1]));

                return actor;
            }
        }).forEach(s-> System.out.println(s.getName()+" "+s.getAge()));

        // 5,将所有的演员对象都保存到List集合中。
        List<Actor> list3 = Stream.concat(stream1, stream2).map(s -> new Actor(s.split(",")[0], Integer.parseInt(s.split(",")[1])))
                .collect(Collectors.toList());

        System.out.println(list3);

总结

今天就说到这吧,大家记得做练习哈

Java - Stream流详解文章来源地址https://www.toymoban.com/news/detail-477289.html

到了这里,关于Java - Stream流详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java,SpringBoot中对Stream流的运用

    详细参考:java 1.8 stream 应用-22种案例_java1.8 流案例-CSDN博客 1. 遍历  2. 汇总

    2024年02月22日
    浏览(45)
  • 带你走进Java8新特性Stream流的小世界

    目录 一. 什么是流(Stream) 1.1 流的定义 1.2 流的特点 1.3 操作流 1.4 创建流 二. 流的中间操作 2.1 流的筛选与切片 2.1.1 filter 2.1.2 limit 2.1.3 skip 2.1.4 distinct 2.2 流的映射 2.2.1 map 2.2.2 flatMap 2.3 流的排序 2.3.1 sort 三. 流的终止操作 3.1 流的查找与匹配 3.1.1 allMatch 3.1.2 anyMatch 3.1.3 none

    2024年01月24日
    浏览(61)
  • Java8特性,Stream流的使用,收集成为map集合

    Java 8引入了Stream API,这是Java集合操作的一个重大改进。Stream API提供了一种高效且易于使用的处理数据的方式。 Stream是数据渠道,用于操作数据源(集合、数组等)所生成的元素序列。注意:Stream自己不会存储元素,它不会改变源对象,反而它的操作会返回一个全新的Strea

    2024年04月22日
    浏览(79)
  • java 8 stream流的19种用法,可应对大多数集合的处理场景

    java 8的Stream API是一种非常强大的集合处理工具,它提供了一种新的、高效的、声明式的方式来处理集合数据。下面我们就来看一下Java 8 Stream API的所有用法。 可以使用Stream.of()方法创建一个Stream: 也可以使用集合的stream()方法创建一个Stream: 可以使用filter()方法过滤Stream中的

    2023年04月08日
    浏览(76)
  • java通过stream流的形式把列表中某个字段的值取出并生成列表

    可以使用Java 8中引入的Stream API来实现这一功能。例如,假设你有一个类名为Person的列表,并且你想要从这个列表中提取所有人的姓名并生成一个新的列表。你可以这样做: 这段代码首先使用 stream() 方法将列表转换为流。然后,使用 map() 方法对流中的每个元素执行一个转换函

    2024年02月12日
    浏览(42)
  • 深度解析Java JDK 1.8中Stream流的源码实现:带你探寻数据流的奥秘

    1.1 什么是Stream流,以及它的主要特点和优势 什么是Stream流 ? jdk1.8 中引入的Stream流是一种用 函数式编程方式 操作集合的新特性,提供了一种更简洁、高效的方式来处理集合数据,可以将集合操作转换为一系列的流水线操作,实现更加优雅和功能强大的数据处理。 主要特点

    2024年03月16日
    浏览(57)
  • 由于对象流解析的数据与流的头部信息不匹配导致异常 java.io.StreamCorruptedException: invalid stream header: 7372001

    错误原因 先直接说错误原因 当使用对象流时,对象头和对象内容一起被写入输出流,而读取时也需要以相同的顺序读取对象头和对象内容 如果读取时的顺序与写入时的顺序不一致,或者在写入或读取对象头和对象内容之间更改了流的状态,则会出现 java.io.StreamCorruptedExcept

    2024年02月05日
    浏览(45)
  • Stream流的中间操作和终端操作

    最近在写代码时发现一个很有意思的问题 问题代码: 输出结果:   第一个map()方法中没有使用collect()方法来收集加工后的流,而是直接调用了第二个map()方法。这样会导致第一个map()方法的结果被丢弃,可为什么第二个map()方法加上forEach会改变原始数据呢? 为了弄明白其中缘

    2024年02月16日
    浏览(53)
  • stream流的collect出现空指针异常

    如果你的stream中存在null元素,而在使用collect方法时没有对null值进行处理,你可以使用过滤器方法(filter)来过滤掉null元素,或者使用Optional类来处理可能为null的元素。 以下是使用过滤器方法的示例代码: 这段代码将会过滤掉list中的null元素,然后将剩余的元素收集到一个

    2024年02月16日
    浏览(36)
  • Redis Stream 流的深度解析与实现高级消息队列【一万字】

    详细介绍了 Redis 5.0 版本新增加的数据结构Stream的使用方式以及原理,如何实现更加可靠的消息队列。 基于Reids的消息队列实现有很多种,比如基于PUB/SUB(订阅/发布)模式、基于List的 PUSH和POP一系列命令的实现、基于Sorted-Set的实现。虽然它们都有各自的特点,比如List支持阻

    2024年02月15日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包