Java-Stream流

一、不可变集合

在List、Set、Map接口中,都存在静态的of方法,获取一个不可变的集合。

List.of() Set.of() Map.of()

注意:这个集合不可删除、修改、添加操作

细节:①Set值不可重复。

②Map中键不可重复。

③Map.of中最多传递20个参数,10个键值对。(这里我的理解就是一旦参数多了之后成对的k-v键值对容易出错,而且使用代码没有办法表示多个键值对)

④Map.OfEntries可传递多个键值对。 Map.ofEntries(Map.entry(1,2),Map.entry(2,1));

java 复制代码
    @Test
    public void test2(){
        // 常量Map 定义常量 不可变 一定是新对象
        Map<Integer, String> constantMap = Map.ofEntries(
                Map.entry(1,"张三"),
                Map.entry(2,"李四"),
                Map.entry(3,"王五")
        );
        List<Map.Entry<Integer, String>> list = new ArrayList<>();

        // 动态添加
        list.add(Map.entry(1, "张三"));
        list.add(Map.entry(2, "李四"));

        Map<Integer, String> map =
                Map.ofEntries(list.toArray(new Map.Entry[0]));

        // 从已有Map拷贝  防御性拷贝 例如一个不可变map转换 可能直接返回原对象  JDK10
        Map<Integer, String> copyMap = Map.copyOf(constantMap);
        System.out.println(copyMap==constantMap);// true


    }

二、Stream流

1. 使用步骤:

①得到一条Stream流,并把数组放上去

②利用Stream流中的API进行各种操作:

  • 中间方法:继续获取新的Stream流,只能用一次,所以推荐使用链式编程。(过滤、转换)

  • 终结方法:最后一步调用完毕,不能再调用其他方法。(统计、打印)

如何获取流?

获取方式 方法名 用法 注意事项
单列集合 default Stream stream(); list.stream() /
双列集合 无特定方法(但可获取keySet()或EntrySet()得到单列集合操作) map.entrySet().stream() /
数组 public static Stream stream(T[] array); Arrays.stream() 传的必须是泛型(不能是基本数据类型!否则返回数组的引用值,此时数组是一个元素)
一些零散数据 public static Stream of(T... values); Stream.of() 传的零散数据要求同类型

2. Stream流的中间方法

  • filter(断定型接口):过滤
  • limit(long maxSize):限制输出数量前maxSize个
  • skip(long n):跳过前n个
  • distinct():去重
  • concat(Stream a,Stream b):合并ab流。注意此处a,b类型一致或父子关系
  • map(函数型接口):转换数据类型

注意事项:①中间方法返回的是新的Stream,只能用一次,推荐使用链式编程

②中间方法修改的是新Stream流中的数据,不影响原来列表数据

3. Stream流中的终结方法

  • void forEach(消费型函数):遍历
  • long count():统计
  • toArray(new IntFunction<泛型:具体类型数组>(){...});//转为数组,需要传递数组大小和类型
  • collect(Collector collector):收集流中的数据放进集合
    list.stream().collect(Collectors.toList())
    list.stream().collect(Collectors.toSet())
    上面两个很简单,一个转为list,一个转为set,但是list转map需要规定键值,所以不能单纯的toMap。
    那么,收集到Map中谁作为键?谁作为值?需要两个函数式接口作为键值的规则定义,如下代码所示:

    结果展示:

    以上代码均使用匿名内部类,为了展示更加清楚,代码可读性更强。大多习惯于lambda表达式编写,也可简化。
相关推荐
历程里程碑2 分钟前
普通数组----合并区间
java·数据结构·python·算法·leetcode·职场和发展·tornado
程序员泠零澪回家种桔子21 分钟前
Spring AI框架全方位详解
java·人工智能·后端·spring·ai·架构
CodeCaptain30 分钟前
nacos-2.3.2-OEM与nacos3.1.x的差异分析
java·经验分享·nacos·springcloud
Anastasiozzzz1 小时前
Java Lambda 揭秘:从匿名内部类到底层原理的深度解析
java·开发语言
骇客野人1 小时前
通过脚本推送Docker镜像
java·docker·容器
铁蛋AI编程实战2 小时前
通义千问 3.5 Turbo GGUF 量化版本地部署教程:4G 显存即可运行,数据永不泄露
java·人工智能·python
晚霞的不甘2 小时前
CANN 编译器深度解析:UB、L1 与 Global Memory 的协同调度机制
java·后端·spring·架构·音视频
SunnyDays10112 小时前
使用 Java 冻结 Excel 行和列:完整指南
java·冻结excel行和列
摇滚侠2 小时前
在 SpringBoot 项目中,开发工具使用 IDEA,.idea 目录下的文件需要提交吗
java·spring boot·intellij-idea
云姜.2 小时前
java多态
java·开发语言·c++