• 收集Stream流


    Stream流的收集操作

    • 收集Stream流的含义:就是把Stream流操作后的结果数据 转回集合 或者 数组 中去。
    • Stream流:方便操作 集合 / 数组 的 手段
    • 集合 / 数组:才是开发中的 目的

    Stream流的收集方法

    • R collect(Collector  collector)
    • 开始收集Stream流,指定收集器
    • Object [ ]        toArray()
    • 返回包含此流元素的数组,这是一个终端操作。
    • 返回:一个数组,其运行时组件类型为Object,包含此流的元素
    • 使用提供的生成器函数来分配返回的数组,以及分区执行或调整大小可能需要的任何其他数组,返回包含此流元素的数组
    • 这是一个终端操作
    • 参数:生成器——一个生成所需类型和提供长度的新数组的函数
    • 返回:包含此流中元素的数组
    • 抛出:ArrayStoreException——如果流中任何元素的运行时类型不能赋值给生成数组的运行时组件类型
    • API注意:生成器函数接受一个整数,即所需数组的大小,并生成所需大小的数组,这可以用一个数组构造函数引用来间接地表达:
    • default  List   toList(){ return  (List)Collections.unmodifiableList(new ArrayList<>(Arrays.asList(this.toArray())))}
    • 将此流的元素累加到List中,列表中的元素将按照该流的相遇顺序(如果存在的话)排列,返回的 List不可修改 的;调用任何mutator方法总是会导致抛出UnsupportedOperationException,不能保证返回的 List 的实现类型或可序列化性。
    • 返回的实例可以基于值,调用者不应该对返回实例的身份做任何假设,对这些实例的身份敏感操作(引用相等性(==)、身份散列码 和 同步)是不可靠的,应该避免。这是一个终端操作。
    • 返回:包含流元素的List
    • API注意:如果需要对返回对象进行更多的控制,请使用Collectors.toCollection(Supplier)
    • 实施要求:这个接口的实现返回一个List,就像下面的操作一样 Collections.unmodifiableList(new ArrayList<>(Arrays.asList(this.toArray())))
    • 实现注意:Stream的大多数实例将覆盖此方法,并提供与此接口中的实现相比高度优化的实现
    • 自JDK 16 起 

    Collectors工具类提供了具体的收集方式

    • public  static  Collector  toList()
    • 把元素收集到List集合中
    • public  static  Collector  toSet()
    • 把元素收集到Set集合中
    • public static  Collector  toMap(Function keyMapper,Function  valueMapper)
    • 把元素收集到Map集合中

    收集Stream流的作用?

    • Stream流是操作 集合 / 数组的手段
    • 操作的结果数据最终要恢复到集合或者数组中去
    1. package com.csdn.streamcollect;
    2. import java.util.*;
    3. import java.util.function.IntFunction;
    4. import java.util.function.Predicate;
    5. import java.util.stream.Collectors;
    6. import java.util.stream.Stream;
    7. public class StreamCollectors {
    8. public static void main(String[] args) {
    9. List list = new ArrayList<>();
    10. Collections.addAll(list, "张三丰", "张翠山", "张无忌", "赵敏", "周芷若");
    11. // Stream stringStream = list.stream().filter(new Predicate() {
    12. // @Override
    13. // public boolean test(String s) {
    14. // return s.startsWith("张");
    15. // }
    16. // });
    17. Stream stringStream = list.stream().filter(s -> s.startsWith("张"));
    18. List collect = stringStream.collect(Collectors.toList());
    19. System.out.println(collect);//[张三丰, 张翠山, 张无忌]
    20. List list1 = list.stream().toList();
    21. System.out.println(list1);//[张三丰, 张翠山, 张无忌, 赵敏, 周芷若]
    22. Stream stringStream1 = list.stream().filter(s -> s.startsWith("张"));
    23. Set collect1 = stringStream1.collect(Collectors.toSet());
    24. System.out.println(collect1);//[张翠山, 张三丰, 张无忌]
    25. Stream stringStream2 = list.stream().filter(s -> s.startsWith("张"));
    26. // Object[] array = stringStream2.toArray();
    27. // System.out.println(Arrays.toString(array));//[张三丰, 张翠山, 张无忌]
    28. // Stream.of(array).forEach(System.out::println);
    29. // 张三丰
    30. // 张翠山
    31. // 张无忌
    32. // String[] array = stringStream2.toArray(new IntFunction() {
    33. // @Override
    34. // public String[] apply(int value) {
    35. // return new String[value];
    36. // }
    37. // });
    38. String[] array = stringStream2.toArray(String[]::new);
    39. Stream.of(array).forEach(System.out::println);
    40. // 张三丰
    41. // 张翠山
    42. // 张无忌
    43. }
    44. }

    toMap()方法的使用

    1. package com.csdn.streamcollect;
    2. import java.util.*;
    3. import java.util.stream.Collectors;
    4. import java.util.stream.Stream;
    5. public class CollectDemo {
    6. public static void main(String[] args) {
    7. //创建List集合对象
    8. List list = new ArrayList<>();
    9. Collections.addAll(list, "张三丰", "张翠山", "张无忌", "赵敏", "周芷若");
    10. //需求 1:得到名字为 3 个字的流
    11. Stream stringStream = list.stream().filter(s -> s.length() == 3);
    12. //需求 2:把使用Stream流操作完毕的数据收集到List集合中并遍历
    13. List name = stringStream.collect(Collectors.toList());
    14. for (String s : name) {
    15. System.out.println(s);//张三丰 张翠山 张无忌 周芷若
    16. }
    17. //创建Set集合对象
    18. Set set = new HashSet<>();
    19. Collections.addAll(set, 10, 20, 30, 33, 35);
    20. //需求 3:得到年龄大于 25 的流
    21. Stream integerStream = set.stream().filter(age -> age > 25);
    22. //需求 4:把使用Stream流操作完毕的数据收集到Set集合中并遍历
    23. Set age = integerStream.collect(Collectors.toSet());
    24. for (Integer i : age) {
    25. System.out.println(i);//33 35 30
    26. }
    27. //定义一个字符串数组,每一个字符串数据由姓名数据和年龄数据组合而成
    28. String[] strArray = {"喜羊羊,30", "美羊羊,35", "懒洋洋,33", "灰太狼,25"};
    29. //需求 5:得到字符串中年龄数据大于 28 的流
    30. Stream arrayStream = Stream.of(strArray).filter(s -> Integer.parseInt(s.split(",")[1]) > 28);
    31. //需求 6:把使用Stream流操作完毕的数据收集到Map集合中并遍历,字符串中的姓名作键,年龄作值
    32. Map map = arrayStream.collect(Collectors.toMap(s -> s.split(",")[0],
    33. s -> Integer.parseInt(s.split(",")[1])));
    34. Set key = map.keySet();
    35. for (String s : key) {
    36. Integer value = map.get(s);
    37. System.out.println(s + "," + value);//美羊羊,35 喜羊羊,30 懒洋洋,33
    38. }
    39. }
    40. }

  • 相关阅读:
    二叉树的建立和前序,中序,后序,遍历(给定节点以及其之间的关系)
    Retrofit2 完全解析 探索与okhttp之间的关系
    Python3+requests+unittest接口自动化测试
    Java 中的基本类型
    HCIA-R&S自用笔记(25)NAT技术背景、NAT类型及配置
    IBM ELM—系统工程全生命周期管理平台
    QT中使用QProcess执行命令,实时获取数据,例如进度条
    Spring Boot DTO 示例 - 实体到 DTO 的转换
    查看linux操作系统版本:Ubuntu?Centos?还是其他?
    【一周安全资讯1118】北京高院发布《侵犯公民个人信息犯罪审判白皮书》;工银金融勒索案的事件响应服务商MoxFive是谁?
  • 原文地址:https://blog.csdn.net/m0_65152767/article/details/133856607