• java_stream流


    Stream流的个人理解

      整体来看,流式思想类似于工厂车间的“生产流水线”,通过一些列操作来获取我们需要的产品

      在Java 8中,得益于Lambda所带来的函数式编程,引入了一个全新的Stream概念,用于解决已有集合类库既有的弊端。

      “Stream流”其实是一个集合元素的函数模型,它并不是集合,也不是数据结构,其本身并不存储任何元素(或其地址值)。

      当需要对多个元素进行操作(特别是多步操作)的时候,考虑到性能及便利性,我们应该首先拼好一个“模型”步骤方案,然后再按照方案去执行它

     

    一.Stream流_Stream流进行集合过滤的效果演示

        1).什么是Stream它在Java中是一个接口它类似于迭代器Stream比迭代器的功能更强大。

                     它也是用来处理集合中的元素,但比迭代器的功能更多。

        2).Stream流可以对集合元素进行连续的筛选、过滤、统计等操作。它再结合Lambda表达式的使用,

             使得这些操作变得非常的简单。

       3).示例代码:

    public class Demo {
        public static void main(String[] args) {
            List<String> list = new ArrayList<>();
            list.add("张无忌");
            list.add("周芷若");
            list.add("赵敏");
            list.add("张强");
            list.add("张三丰");
    
            //1.筛选出所有的张姓学员,并存储到一个新集合
            List<String> list1 = new ArrayList<>();
            for (int i = 0; i < list.size(); i++) {
                if (list.get(i).startsWith("张")) {
                    list1.add(list.get(i));
                }
            }
            //2.再筛选出张姓学员中名字是3个字的学员,并存储到一个新集合
            List<String> list2 = new ArrayList<>();
            for (int i = 0; i < list1.size(); i++) {
                if (list1.get(i).length() == 3) {
                    list2.add(list1.get(i));
                }
            }
    
            //3.打印名字是3个字的学员中的第一名学员:
            System.out.println(list2.get(0));
    
    
            System.out.println("----------------------------------");
    
            //使用Stream流结合Lambda表达式
            list.stream().filter(s -> s.startsWith("张"))
                    .filter(s -> s.length() == 3)
                    .limit(1)
                    .forEach(System.out::println);
        }
    }

    二.Stream流思想概述

             1.流思想:类似于迭代器,用于对”集合元素”和数组进行筛选,过滤,统计用的

             2.流的工作方式:流对象的每一个操作都会使这个对象成为垃圾;但这个操作的方法通常会返回一个新流对象

             每个流对象都是一次性的,类似于流水线

    三. Stream流_获取List_Set_Map_数组流

    1.通过Collection集合(List,Set)获取流

    List:

    List list=new ArrayList();

    list.stream();

    Set:

    Set set=new HashSet();

    set.stream();

    2.通过Map集合获取流(Map集合不能直接获取流,只能先转成Set再获取)

    方式一:

             Map map=new HashMap();

             Set<Map.Entry> set=map.entrySet();

             set.stream();

    方式二:

             Map map=new HashMap();

             Set set=map.values();

             set.stream();

             Set set1=map.keySet();

             set1.stream();

    3.通过数组获取流:

                       A).通过引用类型数组获取流:

                                Integer[] arr1 = {1,2,3,4};

                                String[] arr2 = {"a","b","c"};

                                //1.获取Integer[]数组的流

                                Stream<Integer> integerStream = Stream.of(arr1);

                                //2.获取String[]数组的流

                                Stream<String> stringStream = Stream.of(arr2);

                       B).通过基本类型数组获取流:

                                int[] arr = {1,2,3,4};

                                IntStream s1 = IntStream.of(arr);

    四. Stream流_常用方法_逐一处理forEach

    1.伪代码

            class Stream流的子类<T>{

                //所有元素

                public void forEach(Consumer<T> c){

                    //1.遍历每个元素

                    for(T t : 所有元素){

                        //3.将每个元素放到Consumeraccept()方法过一下

                        c.accept(t);

                    }

                }

            }

    2.只需要重写Consumer接口中的accept方法即可,并传入forEach,forEach参数可以是匿名内部类,lambda或者方法引用

    五. Stream流_常用方法_过滤filter

    Stream<T>

    filter(Predicate<? super T> predicate)

    针对相应条件对流中数据进行过滤,过滤的代码只要重写Predicate接口中test方法即可,test方法返回值为boolean类型,对于返回false的元素过滤出去

    六. Stream流_常用方法_统计个数count

    针对流的操作,统计流中元素的个数并返回long类型值,调用count方法不需要传入参数

    七. Stream流_常用方法_取用前几个limit

    取流中前几个元素,limit方法参数为int类型,代表元素个数, 重新返回一个新流

    八. Stream流_常用方法_跳过前几个skip

    取流中第n个元素以及之后的数据,limit方法参数为int类型,代表跳过元素个数,重新返回一个新流

    九. Stream流_常用方法_映射(转换)map 

    <R> Stream<R>

    map(Function<? super T,? extends R> mapper)

    调用map方法需要传入函数接口Function或者其子类

    定义Function时一般会指定两个泛型,前一个泛型为流中元素类型,后一个泛型代表转换后的元素类型

    进行类型转换,传入一个类型,返回另一个类型,

    十. Stream流_常用方法_合并concat

    concat方法用于将两个流合并成一个流,Stream中的静态方法,调用需要传入两个流参数,返回一个新流

    十一. Stream流_总结_拼接方法与终结方法

    1).拼接方法:这个方法会返回一个Stream流,可以继续对这个流操作。

        2).终结方法:这个方法返回的是最终的值。不是Stream流,不能对流继续操作。

     

    十二. Stream流_常用方法_收集Stream结果collect方法

    1).Stream其实是一个集合元素的函数模型它并不是集合也不是数据结构其本身并不存储任何元素或其地址值

        2).有些时候,我们使用Stream过滤元素后,过滤后的元素时存储在一个新流中,我们希望将这些数据存储到一个新的集合中,

           此时,可以将Stream转换为各种集合:

        3).转换为List集合

            Stream<String> stream = ....;

            //转换为List集合

            List<String> list = stream.collect(Collectors.toList());
           转换为Set集合

            Set<String> set = stream.collect(Collectors.toSet());

           转换为数组:

            Object[] objArray = stream.toArray();

  • 相关阅读:
    Node.js
    EFCore-Migrations
    C#核心语法
    C#编程总结--总目录
    PHP ServerPush
    汉字转拼音
    用五分钟重温委托,匿名方法,Lambda,泛型委托,表达式树
    Sublime Text 3 绝对神器
    多线程学习总结
    分享: 利用Readability解决网页正文提取问题
  • 原文地址:https://www.cnblogs.com/aihuadung/p/10783955.html
Copyright © 2020-2023  润新知