• java 集合stream流 详解


    一、stream流的常见生成方式

    1、Collection体系集合

    使用默认方法stream()生成流, default Stream stream() 

    1. //Collection体系的集合可以使用默认方法stream()生成流
    2. List list = new ArrayList();
    3. Stream listStream = list.stream();
    4. Set set = new HashSet();
    5. Stream setStream = set.stream();

    2、Map体系集合

    把Map转成Set集合,间接的生成流

    1. //Map体系的集合间接的生成流
    2. Map map = new HashMap();
    3. Stream keyStream = map.keySet().stream();
    4. Stream valueStream = map.values().stream();
    5. Stream> entryStream = map.entrySet().stream();

    3、数组

    通过Arrays中的静态方法stream生成流

    1. //数组可以通过Arrays中的静态方法stream生成流
    2. String[] strArray = {"hello","world","java"};
    3. Stream strArrayStream = Arrays.stream(strArray);

    4、同种数据类型的多个数据

    通过Stream接口的静态方法of(T... values)生成流

    1. //同种数据类型的多个数据可以通过Stream接口的静态方法of(T... values)生成流
    2. Stream strArrayStream2 = Stream.of("hello", "world", "java");
    3. Stream intStream = Stream.of(10, 20, 30);

    二、Stream流中间操作方法

    中间操作的意思是,执行完此方法之后,Stream流依然可以继续执行其他操作

    常见方法

    Stream filter(Predicate predicate)    用于对流中的数据进行过滤       

    1. //创建一个集合,存储多个字符串元素
    2. ArrayList list = new ArrayList();
    3. list.add("林青霞");
    4. list.add("张曼玉");
    5. list.add("王祖贤");
    6. list.add("柳岩");
    7. list.add("张敏");
    8. list.add("张无忌");
    9. //需求1:把list集合中以张开头的元素在控制台输出
    10. list.stream().filter(s -> s.startsWith("张")).forEach(System.out::println);
    11. System.out.println("--------");
    12. //需求2:把list集合中长度为3的元素在控制台输出
    13. list.stream().filter(s -> s.length() == 3).forEach(System.out::println);
    14. System.out.println("--------");
    15. //需求3:把list集合中以张开头的,长度为3的元素在控制台输出
    16. list.stream().filter(s -> s.startsWith("张")).filter(s -> s.length() == 3).forEach(System.out::println);

     Stream limit(long maxSize)    返回此流中的元素组成的流,截取前指定参数个数的数据
     Stream skip(long n)      跳过指定参数个数的数据,返回由该流的剩余元素组成的流

    1. //创建一个集合,存储多个字符串元素
    2. ArrayList list = new ArrayList();
    3. list.add("林青霞");
    4. list.add("王祖贤");
    5. list.add("柳岩");
    6. list.add("张敏");
    7. list.add("张无忌");
    8. //需求1:取前3个数据在控制台输出
    9. list.stream().limit(3).forEach(System.out::println);
    10. System.out.println("--------");
    11. //需求2:跳过3个元素,把剩下的元素在控制台输出
    12. list.stream().skip(3).forEach(System.out::println);
    13. System.out.println("--------");
    14. //需求3:跳过2个元素,把剩下的元素中前2个在控制台输出
    15. list.stream().skip(2).limit(2).forEach(System.out::println);

    static Stream concat(Stream a, Stream b)      合并a和b两个流为一个流 
    Stream distinct()   返回由该流的去重(根据Object.equals(Object) )之后的不同元素组成的流

    1. //创建一个集合,存储多个字符串元素
    2. ArrayList list = new ArrayList();
    3. list.add("林青霞");
    4. list.add("张曼玉");
    5. list.add("王祖贤");
    6. list.add("柳岩");
    7. list.add("张敏");
    8. list.add("张无忌");
    9. //需求1:取前4个数据组成一个流
    10. Stream s1 = list.stream().limit(4);
    11. //需求2:跳过2个数据组成一个流
    12. Stream s2 = list.stream().skip(2);
    13. //需求3:合并需求1和需求2得到的流,并把结果在控制台输出
    14. Stream.concat(s1,s2).forEach(System.out::println);
    15. //需求4:合并需求1和需求2得到的流,并把结果在控制台输出,要求字符串元素不能重复
    16. Stream.concat(s1,s2).distinct().forEach(System.out::println);

    Stream流终结操作方法

    终结操作的意思是,执行完此方法之后,Stream流将不能再执行其他操作

    void forEach(Consumer action)      对此流的每个元素执行操作
    long count()                返回此流中的元素数

    1. //创建一个集合,存储多个字符串元素
    2. ArrayList list = new ArrayList();
    3. list.add("林青霞");
    4. list.add("张曼玉");
    5. list.add("王祖贤");
    6. list.add("柳岩");
    7. list.add("张敏");
    8. list.add("张无忌");
    9. //需求1:把集合中的元素在控制台输出
    10. list.stream().forEach(System.out::println);
    11. //需求2:统计集合中有几个以张开头的元素,并把统计结果在控制台输出
    12. long count = list.stream().filter(s -> s.startsWith("张")).count();
    13. System.out.println(count);

    Stream流的收集操作

    对数据使用Stream流的方式操作完毕后,可以把流中的数据收集到集合中

    R collect(Collector collector)            把结果收集到集合中

    工具类Collectors提供了具体的收集方式
    public static Collector toList()     把元素收集到List集合中 
    public static Collector toSet()     把元素收集到Set集合中
    public static  Collector toMap(Function keyMapper,Function valueMapper) 把元素收集到Map集合中

    1. //创建List集合对象
    2. List list = new ArrayList();
    3. list.add("林青霞");
    4. list.add("张曼玉");
    5. list.add("王祖贤");
    6. list.add("柳岩");
    7. //需求1:得到名字为3个字的流
    8. Stream listStream = list.stream().filter(s -> s.length() == 3);
    9. //需求2:把使用Stream流操作完毕的数据收集到List集合中并遍历
    10. List names = listStream.collect(Collectors.toList());
    11. for(String name : names) {
    12. System.out.println(name);
    13. }
    14. //创建Set集合对象
    15. Set set = new HashSet();
    16. set.add(10);
    17. set.add(20);
    18. set.add(30);
    19. set.add(33);
    20. set.add(35);
    21. //需求3:得到年龄大于25的流
    22. Stream setStream = set.stream().filter(age -> age > 25);
    23. //需求4:把使用Stream流操作完毕的数据收集到Set集合中并遍历
    24. Set ages = setStream.collect(Collectors.toSet());
    25. for(Integer age : ages) {
    26. System.out.println(age);
    27. }
    28. //定义一个字符串数组,每一个字符串数据由姓名数据和年龄数据组合而成
    29. String[] strArray = {"林青霞,30", "张曼玉,35", "王祖贤,33", "柳岩,25"};
    30. //需求5:得到字符串中年龄数据大于28的流
    31. Stream arrayStream = Stream.of(strArray).filter(s -> Integer.parseInt(s.split(",")[1]) > 28);
    32. //需求6:把使用Stream流操作完毕的数据收集到Map集合中并遍历,字符串中的姓名作键,年龄作值
    33. Map map = arrayStream.collect(Collectors.toMap(s -> s.split(",")[0], s -> Integer.parseInt(s.split(",")[1])));
    34. Set keySet = map.keySet();
    35. for (String key : keySet) {
    36. Integer value = map.get(key);
    37. System.out.println(key + "," + value);
    38. }

  • 相关阅读:
    股票接口的推出对于散户有哪些意义?
    vue+element后台菜单权限动态配置
    【算法学习】归并算法Merge Sort总结
    关于C2447 “{”: 缺少函数标题(是否是老式的形式表?)
    编程-设计模式 11:享元模式
    在线生产cron定时任务表达式
    数据准备之日志采集发展历程
    怕客户跑单?这套上市制造企业都在使的订单管理方案你一定要看看
    某石油化工数字化交付项目
    香橙派 c# iot .net 通过WiringOP库控制继电器吸合开关 代码实例
  • 原文地址:https://blog.csdn.net/u012758488/article/details/126269067