java8新特性——Stream

Posted 小林さん

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java8新特性——Stream相关的知识,希望对你有一定的参考价值。

一.stream介绍

stream(流)是一个来自数据源的元素队列

集合讲的是数据,而流讲的是计算

注意:

①stream自己不会存储元素

②stream不会改变源对象,相反他会返回一个持有结果的新stream

③stream操作是延时执行的,这意味着他们会等到需要结果的时候才执行

stream操作的三个步骤

①创建stream

    //1.通过Collection 系列集合提供的stream()[串行流]或 [并行流]来生成流
        List list = new ArrayList();
        Stream stream = list.stream();

        //2.通过Arrays中的静态方法stream()获取数据流
        String[] arr = new String[10];
        Stream<String> stream1 = Arrays.stream(arr);

        //3.通过Stream类中的静态方法of()
        Stream<String> aa = Stream.of("aa", "bb", "cc");//4.创建无限流
        //迭代
        Stream<Integer> iterate = Stream.iterate(0, (x) -> x + 2);//生成
        Stream.generate(() -> Math.random());

 

②中间操作

        List list = List.of("aa","bb","cc","aa");
        //1.filter 排除某些元素
        // 将内容为"aa"的元素排除
        list.stream().filter( (str)-> !str.equals("aa")).forEach(System.out::println);

        //2.limit 截断流,使其元素不超过给定数量
        // 取两个元素
        list.stream().limit(2).forEach(System.out::println);

        //3.skip 跳过元素,返回一个扔掉了前n个元素的流
        // 跳过两个元素
        list.stream().skip(2).forEach(System.out::println);

        //4.distinct 筛选,通过流生成元素的hashCode()和equals()去除重复元素
        list.stream().distinct().forEach(System.out::println);

        //5.map 映射,将元素转换成其他形式或提取信息。接受一个函数作为参数,该函数会被应用到每个元素上,并将其映射成一个新的元素
        //将流中的元素全部转换成大写
        Stream<String> string = list.stream();
        string.map((str) -> str.toUpperCase()).forEach(System.out::println);

        //6.flatMap  接受一个函数作为参数,将流中的每个值都换成另一个流,然后把所有流连接成一个流
        List<List<String>> list02 = new ArrayList();
        list02.add(list);
        list02.add(list);
        /**
         *  现在list里的数据为[ ["aa","bb","cc","aa"],["aa","bb","cc","aa"] ]
         *  如果用map映射的话 stream流里的结构是 { {"aa","bb","cc","aa"},{"aa","bb","cc","aa"} }的
         *  如果用flatmap映射的话 stream流里的结构就是 {"aa","bb","cc","aa","aa","bb","cc","aa" }的
         */
        Stream<List<String>> stringStream = list02.stream();
        stringStream.map((lst) -> lst.stream().map((str) -> str.toUpperCase()));

        /**
         * 7.排序
         * sorted()  自然排序,就是用Comparable的方式取排
         * sorted(Comparator com)  自定义排序
         */
         //自然排序
         List list03 = List.of("hh","b","cccc","aaa");
         list03.stream().sorted().forEach(System.out::println);
         //结果: aaa  b  cccc  hh

         //自定义按照长度排序
         Stream<String> stringStream1 = list03.stream();
         stringStream1.sorted((str1,str2) -> str2.length()-str1.length()).forEach(System.out::println);
         //结果: cccc aaa hh b

  

③终止操作

每当终止语句执行后,这个流就会关闭

     /**
         * allMatch  检查是否所有元素都符合匹配条件
         * anyMatch  检查是否至少有一个元素符合匹配条件
         * noneMatch  检查是否没有元素匹配条件
         * findFirst  返回第一个元素
         * findAny  返回当前流中的任意元素
         * count  返回流中元素的个数
         * max  返回流中最大值
         * min  返回流中最小值
         * reduce(T identity,BinaryOperator) /reduce(BinaryOperator) 将流中元素反复结合起来,得到一个值
         * collect  收集,将流转换为其他形式,接收一个Conllector接口的实现,用于给stream中元素做汇总的方法
         */

        //allMatch,anyMatch,noneMatch
        List list = List.of("aa","bbb","c","dddd");
        Stream<String> stringStream = list.stream();
        //检查元素是否长度都大于5
        boolean b = stringStream.anyMatch((str) -> str.length() > 5);
        System.out.println(b);
        //结果为: false

        //count
        Stream<String> stringStream02 = list.stream();
        //取得元素长度
        long count = stringStream02.count();
        System.out.println(count);
        //结果为: 4

        //findFirst
        Stream<String> stringStream03 = list.stream();
        //取得第一个元素
        Optional<String> op = stringStream03.findFirst();
        //Optional 是一个java容器,具体不在此解释
        System.out.println(op.get());
        //结果为: aa

        //findAny
        Stream<String> stringStream04 = list.stream();
        Stream<String> stringStream05 = list.parallelStream();
        //取得任意元素
        //如果是parallelstream()并行流 就会多个线程去获取,结果会随机
        //但如果是stream()串行流 就只能获取第一个
        Optional<String> any = stringStream04.findAny();
        System.out.println(any.get());
        System.out.println(stringStream05.findAny().get());

        //max
        //取得流中长度最大值
        Stream<String> stringStream06 = list.stream();
        Optional<String> max = stringStream06.max(String::compareTo);
        System.out.println(max.get());

        //reduce
        //将流中所有字符串拼接
        Stream<String> stringStream07 = list.stream();
        Stream<String> stringStream08 = list.stream();
        //因为这个设置了起始值"" 避免了空指针, 所以结果为String类型
        String reduce = stringStream07.reduce("",String::concat);
        System.out.println(reduce);
        //这个没有起始值, 所以返回值类型为Optional
        Optional<String> reduce1 = stringStream08.reduce(String::concat);

        //collect
        //将流转换为容器list
        Stream<String> stringStream09 = list.stream();
        List<String> collect = stringStream09.collect(Collectors.toList());
        System.out.println(collect);
        //如果要转换成arraylist则需要Collectors.toCollection来转
        Stream<String> stringStream10 = list.stream();
        ArrayList<String> collect1 = stringStream10.collect(Collectors.toCollection(ArrayList::new));
        System.out.println(collect1);
        //Collectors里面有很多方法,比如求和,平均值,分组,多级分组,分区等很多灵活操作

  

 

以上是关于java8新特性——Stream的主要内容,如果未能解决你的问题,请参考以下文章

Java8新特性代码示例(附注释)- 方法引用,Optional, Stream

Java8新特性第3章(Stream API)

Java8新特性—— Stream集合运算流入门学习

Java8新特性:Stream的使用

Java8新特性Stream流之匹配与查找

Java8新特性Stream流之匹配与查找