认真阅读完这篇文章熟练掌握Stream流的基本应用(创建方法,中间操作,终止操作)

举报
桃花键神 发表于 2022/04/17 12:39:35 2022/04/17
【摘要】 认真阅读完这篇文章熟练掌握Stream流的基本应用(创建方法,中间操作,终止操作)

一、Stream流技术

1、Stream(流)是一个来自数据源的元素队列并支持聚合操作
2、元素是特定类型的对象,形成一个队列。 Java中的Stream并不会存储元素,而是按需计算。
3、数据源 流的来源。 可以是集合,数组,I/O channel, 产生器generator 等。
4、聚合操作 类似SQL语句一样的操作, 比如filter, map, reduce, find, match, sorted等。
5、和以前的Collection操作不同, Stream操作还有两个基础的特征:
Pipelining: 中间操作都会返回流对象本身。 这样多个操作可以串联成一个管道, 如同流式风格(fluent style)。 这样做可以对操作进行优化, 比如延迟执行(laziness)和短路( shortcircuiting)。
内部迭代: 以前对集合遍历都是通过Iterator或者For-Each的方式, 显式的在集合外部进行迭代, 这叫做外部迭代。 Stream提供了内部迭代的方式, 通过访问者模式(Visitor)实现。

二、流的常用创建方法

使用Stream中的静态方法:of()、iterate()、generate()创建流

//使用Stream中的静态方法:of()、iterate()、generate()。都是创建流的方法
        var s1 = Stream.of(1, 2, 3);
        s1.forEach(System.out::println);
        var s2 = Stream.generate(() -> "ok").limit(5);
        s2.forEach(System.out::println);
        var s3 = Stream.iterate(1, (a) -> a + 2).limit(5);
        s3.forEach(System.out::println);

使用Arrays 中的 stream() 方法,将数组转成流

 //将Integer[]转为Stream类型
        Integer[] integer = new Integer[10];
        Stream<Integer> stream = Arrays.stream(integer);

使用lines方法将文件内容按行转成流

//将文件内容按行转成流
        BufferedReader bufferedReader = new BufferedReader(new FileReader("D:\\abc.txt"));
        Stream<String> stream = bufferedReader.lines();
        stream.forEach(System.out::println);
   String sg = "D:\\idea\\A2\\src\\main\\java\\Check.java";
        File file = new File(sg);
        try (BufferedReader bf = new BufferedReader(new FileReader(file))) {
            var i = new AtomicInteger();
            bf.lines().forEach(e -> System.out.printf("%02d、 %s%n", i.getAndIncrement(), e));

        }

将字符串分割成流

 //将字符串分割成流
        //lombda表达式
        Pattern p = Pattern.compile("[+]");
        //将-替换成+-
        String str = "1+2+3-5-1+9".replace("-", "+-");
        //以+号分割字符串
        p.splitAsStream(str).forEach(System.out::println);

三、流的中间操作

filter:过滤流中的某些元素
limit:获取N个元素
skip:跳过n个元素开始,配合limit可以实现分页
distinct:通过流中的hashCode()和equals()去除重复元素

Stream<Integer> stream = Stream.of(1, 2, 3, 4, 5, 6, 7, 8, 9, 3, 5, 6, 11, 23, 33);
        Stream<Integer> stream1 = stream.filter(a -> a > 5)//筛选出比5大的数
                .distinct()//去除重复的数
                .skip(2)//跳过两位元素
                .limit(3);//最多输出三个元素
        stream1.forEach(System.out::println);

映射
map:接收一个函数作为参数,该函数被应用到每个元素上,并将其映射成一个新元素。
flatmap:接收一个函数作为参数,将流中的每一个值都替换成另一个流,然后把所有流连成一个流。

  //使用map函数将元素中的,替换
        List<String> list1 = new ArrayList<String>();
        list1.add("a,s,c");
        list1.add("1,2,3,4");
        Stream<String> stream = list1.stream().map(s -> s.replaceAll(",", ""));
        stream.forEach(System.out::println);

 //使用flatmap函数将元素中的,去除
        List<String> list1 = new ArrayList<String>();
        list1.add("a,s,c");
        list1.add("1,2,3,4");
        Stream<String> stream1 = list1.stream().flatMap(s -> {
            String[] st = s.split(",");
            Stream<String> stream2 = Arrays.stream(st);
            return stream2;
        });
        stream1.forEach(System.out::println);

排序
sorted:自然排序,流中的元素需要实现comparatorble接口。
sorted(COmparator com):定制排序,自定义comparator com排序器。
在这里插入图片描述
消费
Peek:如同与map,能得到流中的每一个元素。但map接收的是一个Function表达式,有返回值;而peek接收的是Consumer表达式,没有返回值。
在这里插入图片描述

四、流的终止操作

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。