• 收集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. }

  • 相关阅读:
    FastAPI 学习之路(九)请求体有多个参数如何处理?
    1056 Mice and Rice
    32、Nio(selector(处理消息边界问题(三种方案)))
    2022年第三季度泛出行行业洞察:泛出行行业正在经历数智化升级的关键时期,用户规模保持平稳增长,行业整体良性发展
    3分钟读懂OKR | 不和绩效挂钩的OKR到底有什么用?
    C++ 访问说明符详解:封装数据,控制访问,提升安全性
    实现分布式下的全局唯一ID
    mdr1基因寡核苷酸/酸敏感靶多肽/聚乙二醇埃博霉素B偶联阿霉素的相关制备
    深度学习快速入门----Pytorch 系列2
    计算机网络 :网络层
  • 原文地址:https://blog.csdn.net/m0_65152767/article/details/133856607