• JAVA:浅谈Stream流


    在阅读本文章之前请了解什么叫  Lambda表达式  以及  如何使用 

    一、Stream流

    Stream流的使用步骤:

    1. 获得一条Stream流,并且将数据放上去
      1. 单列集合获取Stream流
        1. // 1. 单列集合获取Stream
        2. ArrayList list = new ArrayList();
        3. list.add("a");
        4. list.add("b");
        5. // 2. 获取Stream流
        6. list.stream().forEach(e-> System.out.println(e));
      2. 双列集合获取Stream需要转化为单列集合
        1. // 1. 双列集合获取Stream
        2. HashMap hm = new HashMap();
        3. hm.put("a",1);
        4. hm.put("b",2);
        5. // 2. 双列集合获取Stream需要转化为单列集合
        6. // 使用keyset/entryset
        7. hm.keySet().stream().forEach(key -> System.out.println(key));
      3. 数组获取Steam需要通过Arrays
        1. // 1. 数组获取Stream流
        2. int[] arr = {1,2,3,4,5,6,7,8};
        3. // 2. 数组通过Arrays获取Stream流
        4. Arrays.stream(arr).forEach(e-> System.out.println(e));
      4. 零散数据通过Stream中的of获取,但是需要零散数据为同种数据类型。如果of传递的是数组,则必须传递引用数据类型的数组,不能是基本数据类型的(八大基本数据类型)
        1. // 1. 零散数据获取Stream流
        2. Stream.of(1234).forEach(e-> System.out.println(e));
        3. // 2. 零散数据获取stream通过of
        4. // 但是切记零散数据需要这些数据为同种数据类型
        5. Stream.of("A","B").forEach(e-> System.out.println(e));
    2. 利用Stream流的API操作数据
      •  中间方法:方法调用完成后还可以调用其他中间方法,一般例如:过滤、装换
      •  终结方法:最后一步,不能在调用其他方法,一般例如:统计、 打印     

    二、Stream流的中间方法

     2.1 过滤filter

    1. ArrayList arr = new ArrayList();
    2. Collections.addAll(arr,1,10,16,27,29,29,30,40,50);
    3. // 1. 获取stream流,使用filter过滤大于等于30的数字
    4. arr.stream().filter(e->e<30).forEach(e-> System.out.println(e));

    2.2 获取前几个元素limit

    1. ArrayList arr = new ArrayList();
    2. Collections.addAll(arr,1,10,16,27,29,29,30,40,50);
    3. // 1. 获取stream流,获取前5个元素
    4. arr.stream().limit(5).forEach(e-> System.out.println(e));

     
    2.3 跳过前几个元素skip 

    1. ArrayList arr = new ArrayList();
    2. Collections.addAll(arr,1,10,16,27,29,29,30,40,50);
    3. // 1. 获取stream流,跳过5个元素
    4. arr.stream().skip(5).forEach(e-> System.out.println(e));

    2.4 去重distinct

    1. ArrayList arr = new ArrayList();
    2. Collections.addAll(arr,1,10,16,27,29,29,30,40,50);
    3. // 1. 获取stream流,去重
    4. arr.stream().distinct().forEach(e-> System.out.println(e));

    2.5 合并两个流concat

    1. ArrayList arr1 = new ArrayList();
    2. ArrayList arr2 = new ArrayList();
    3. Collections.addAll(arr1,1,10,16);
    4. Collections.addAll(arr2,2,10,26);
    5. // 1. 获取stream流,合并去重
    6. Stream.concat(arr1.stream(),arr2.stream())
    7. .distinct()
    8. .forEach(e-> System.out.println(e));

    2.6 转化流中数据类型map 

    1. ArrayList arr1 = new ArrayList();
    2. Collections.addAll(arr1,"a-1","b-2","c-3","d-4");
    3. // 1. 获取stream流,并且只打印数字 使用map进行类型转化
    4. arr1.stream()
    5. .map(e->Integer.parseInt(e.split("-")[1]))
    6. .forEach(e-> System.out.println(e));

     

    三、Stream流的终结方法

    3.1 遍历forEach

    这个没啥好说的,上面中间方法的所有例子的终结方法都是foreach

    3.2 统计count

    1. ArrayList arr1 = new ArrayList();
    2. Collections.addAll(arr1, 1,2,3,4,5,6,7,8,9,10,11);
    3. long count = arr1.stream().count();
    4. System.out.println(count);

    3.3 收集到数组中 toArray

    1. ArrayList arr1 = new ArrayList();
    2. Collections.addAll(arr1,"a-1","b-2","c-3","d-4");
    3. // 1. 获取stream流,并且存储到数组中 toArray
    4. // 2. 如果toArry为空参则对象为Object
    5. Object[] objects = arr1.stream().toArray();
    6. System.out.println(Arrays.toString(objects));
    7. // 3. 如果需要转为指定类型的数组则需要传参 参数传递为 个数->需要数组类型【个数】
    8. String[] strings = arr1.stream().toArray(e -> new String[e]);
    9. System.out.println(Arrays.toString(strings));

    3.4 收集到集合中collect

    1. ArrayList arr1 = new ArrayList();
    2. Collections.addAll(arr1,"a-1","b-2","c-3","d-4","d-4");
    3. // 1. 获取stream流,并且存储到List集合当中
    4. // .collect(Collectors.toList()) 底层会自动为我们创建list集合
    5. List collect = arr1.stream().collect(Collectors.toList());
    6. // 2. 获取stream流,并且存储到Set集合当中
    7. Set collect1 = arr1.stream().collect(Collectors.toSet());
    8. System.out.println("list:"+collect);
    9. System.out.println("set:"+collect1);

     通过输出我们可以看到,存储在list与set集合中的区别,set会去重

     注意转化list到map的时候 不能有相同的key出现哦!!!!

    1. ArrayList arr1 = new ArrayList();
    2. Collections.addAll(arr1,"a-1","b-2","c-3","d-4");
    3. // 3. 获取stream流,并且存储到map集合当中 a为键 1为值
    4. /*
    5. tomap:参数1:键的生成规则
    6. 参数2:值的生成规则
    7. */
    8. Map collect2 = arr1.stream()
    9. .collect(Collectors.toMap(
    10. e -> e.split("-")[0], //参数1
    11. e -> e.split("-")[1] //参数2
    12. ));
    13. System.out.println("map:"+collect2);
  • 相关阅读:
    新手教程,蛋糕小程序的搭建流程一网打尽
    Linux Kernel 4.13 RC6发布:正式版9月3日发布
    SQL注入原理、过程、防御方案、RASP概念
    practical on mifare
    【UML用户指南】-02-UML基本元素的介绍(二)
    Qt加载SVG矢量图片,放大缩小图片质量不发生变化。
    JAVA——通过自定义注解实现每次程序启动时,自动扫描被注解的方法,获取其路径及访问该路径所需的权限并写入数据库
    Linux上通过mysqldump命令实现自动备份
    java计算机毕业设计航空售票系统MyBatis+系统+LW文档+源码+调试部署
    React 中的 Solidity 和 Ethereum (Next JS):完整指南
  • 原文地址:https://blog.csdn.net/jialuosi/article/details/139470155