java 不可变集合的创建和Stream流的使用

文章目录

    • 一、创建不可变的集合
      • 1.1为什么创建不可变的集合
      • 1.2 创建List、Set和Map的不可变集合
        • 1.2.1 创建List的不可变集合
        • 1.2.2 创建Set 的不可变集合
        • 1.2.3 创建Map的不可变集合
    • 二、使用集合 的Stream 流
      • 2.1 Stream的使用步骤
      • 2.2 Stream的方法
    • 三、如何获取Stream 流对象
    • 四、练习使用集合的Stream 流

一、创建不可变的集合

1.1为什么创建不可变的集合

  • 不可变集合是线程安全的,因为它们的状态在创建后不会改变。多个线程可以安全地共享和读取不可变集合,而无需同步。
  • 不可变集合不允许修改,可以安全地缓存和重用
  • 在多线程环境下使用 Stream 时,确保没有其他线程修改源集合

1.2 创建List、Set和Map的不可变集合

1.2.1 创建List的不可变集合
  • 方式一
public class Demo09 {public static void main(String[] args) {// 创建不可变的List集合List<String> list = List.of("张飞","关羽","刘备","曹操","孙权","孙尚香","吕布");// 增强for 循环 遍历for (String s : list){System.out.println(s);}// 迭代器 遍历Iterator<String> iterator = list.iterator();while (iterator.hasNext()){System.out.println(iterator.next());}list.set(0,"张三"); // 集合不可修改,会报异常}
}
  • 方式二
public class Demo09 {public static void main(String[] args) {List<String> list = Arrays.asList("张飞","关羽","刘备","曹操","孙权","孙尚香","吕布");List<String> immutableList = Collections.unmodifiableList(list); // 设置不可变// 增强for 循环 遍历for (String s : immutableList){System.out.println(s);}// 迭代器 遍历Iterator<String> iterator = immutableList.iterator();while (iterator.hasNext()){System.out.println(iterator.next());}immutableList.set(0,"张三"); // 集合不可修改会报异常}
}
1.2.2 创建Set 的不可变集合
public class Demo09 {public static void main(String[] args) {// 创建 Set 的不可变集合Set<String> set = Set.of("张飞","关羽","刘备","曹操","孙权","孙尚香","吕布");// 增强for 循环遍历for (String s : set){System.out.println(s);}//  迭代器遍历Iterator<String> iterator = set.iterator();while (iterator.hasNext()){System.out.println(iterator.next());}set.add("诸葛亮"); // 不可变,报异常}
}
1.2.3 创建Map的不可变集合
  • 初版,不建议
public class Demo09 {public static void main(String[] args) {// 创建 Map的不可变集合 最多十个键值对,一般不用这种方式Map<String,Object> map1 = Map.of("姓名","张三","年龄",25,"地址","北京");// 创建不可变的Map 集合,元素个数不限Map<String,Object> map = new HashMap<>();map.put("姓名","李四");map.put("年龄",25);map.put("地址","北京");Set<Map.Entry<String,Object>> entrySet = map.entrySet();Map.Entry[] arr1 = new Map.Entry[0];// 底层会比较 entrySet 和arr1 的长度 ,长度不够会创建新的数组Map.Entry[] arrayEntry = entrySet.toArray(arr1); // Entry数组Map<String,Object> immutableMap  = Map.ofEntries(arrayEntry); // 不可变集合immutableMap.put("工资",10000); // 不支持修改,报异常}
}
  • 使用copyOf ,建议
public class Demo09 {public static void main(String[] args) {// 创建 Map的不可变集合 最多十个键值对,一般不用这种方式Map<String,Object> map1 = Map.of("姓名","张三","年龄",25,"地址","北京");// 创建不可变的Map 集合,元素个数不限Map<String,Object> map = new HashMap<>();map.put("姓名","李四");map.put("年龄",25);map.put("地址","北京");Map<String,Object> immutableMap = Map.copyOf(map); // 创建不可变的集合// 遍历方式一Set<String> ketSet = map.keySet();for (String key:ketSet){System.out.println(map.get(key));}// 遍历方式二Set<Map.Entry<String,Object>> entrySet = map.entrySet();for (Map.Entry entry: entrySet ){System.out.println(entry.getKey() + "=" + entry.getValue());}immutableMap.put("工资",10000); // 不可变,报异常}
}

二、使用集合 的Stream 流

2.1 Stream的使用步骤

获取到集合的Stream 流,相当于流水线 --> 把数据交给流处理 ,帅选,检查等 --> 流返回一个新的集合,流水线产品

  • 获取Stream 对象
  • 使用中间方法处理数据
  • 使用终结方法处理数据
  • 结合lambda表达式,简化操作
  • 终结方法一旦被调用,stream对象也就不可用了

2.2 Stream的方法

  • 常用处理方法(中间过程),返回Stream对象,链式调用
    图1
  • 终结方法,用于遍历,统计、获取新的集合等,一经调用后Stream 对象就不可用了
    图2

三、如何获取Stream 流对象

  • 单列集合(List/Set):使用stream方法
  • 双列集合(Map):不能直接获取,需要转换成Set
  • 数组:Arrays的静态方法stream
  • 一堆零散的数据:Stream 接口的静态方法of

四、练习使用集合的Stream 流

  • 案例一:统计集合中姓张的人数
public class Demo09 {public static void main(String[] args) {List<String> list = List.of("刘备","关羽","曹操","张飞","李四","张苞");long count = list.stream().filter(s->s.startsWith("张")).count();System.out.println("姓张的总人数:" + count);}
}
  • 案例二:输出集合中所有姓张的人名
public class Demo09 {public static void main(String[] args) {List<String> list = List.of("刘备","关羽","曹操","张飞","李四","张苞");list.stream().filter(s->s.startsWith("张")).forEach(s -> System.out.println(s));}
}
  • 案例三:输出前三个人的名字
public class Demo09 {public static void main(String[] args) {List<String> list = List.of("刘备","关羽","曹操","张飞","李四","张苞");list.stream().limit(3).forEach(s -> System.out.println(s));}
}
  • 案例四:输出第四个人开始后面所有人的名字
public class Demo09 {public static void main(String[] args) {List<String> list = List.of("刘备","关羽","曹操","张飞","李四","张苞");list.stream().skip(3).forEach(s -> System.out.println(s));}
}
  • 案例五:去除重复的人名
public class Demo09 {public static void main(String[] args) {List<String> list = List.of("刘备","刘备","关羽","曹操","张飞","李四","张苞");list.stream().distinct().forEach(s -> System.out.println(s));}
}
  • 案例六:合并两个集合
public class Demo09 {public static void main(String[] args) {List<String> list1 = List.of("刘备","刘备","关羽","曹操","张飞","李四","张苞");List<String> list2 = List.of("王五","刘六");Stream<String> stringStream =  Stream.concat(list1.stream(),list2.stream());stringStream.forEach(s -> System.out.println(s));}
}
  • 案例七:将集合的结果保存到数组中
public class Demo09 {public static void main(String[] args) {List<String> list1 = List.of("刘备","刘备","关羽","曹操","张飞","李四","张苞");Object[] objects =  list1.stream().distinct().limit(3).toArray();for (Object o : objects){System.out.println(o.toString());}}
  • 案例八:将Stream的处理结果放到集合中
public class Demo09 {public static void main(String[] args) {List<String> list1 = List.of("刘备", "刘备", "关羽", "曹操", "张飞", "李四", "张苞");// 方式一:不指定具体类型的数组
//        Object[] objects = list1.stream()
//                .distinct()
//                .limit(3)
//                .toArray();
//        System.out.println(Arrays.toString(objects));// 方式二:指定类型的数组String arr[] = list1.stream().toArray(new IntFunction<String[]>() {@Overridepublic String[] apply(int value) {return new String[value];}});System.out.println(Arrays.toString(arr));}
}

改成Lamda 表达式

public class Demo09 {public static void main(String[] args) {List<String> list1 = List.of("刘备", "刘备", "关羽", "曹操", "张飞", "李四", "张苞");// 方式一:不指定具体类型的数组
//        Object[] objects = list1.stream()
//                .distinct()
//                .limit(3)
//                .toArray();
//        System.out.println(Arrays.toString(objects));// 方式二:指定类型的数组String arr[] = list1.stream().toArray(value -> new String[value]);System.out.println(Arrays.toString(arr));}
}
  • 将数据收集到集合中
public class Demo09 {public static void main(String[] args) {ArrayList<String> arrayList = new ArrayList<>();Collections.addAll(arrayList,"张三丰-男-99","周芷若-女-25","张无忌-男-21");Collections.unmodifiableList(arrayList);// 设置为不可变的集合// 需求1:把所有的男性收集起来,放到一个List集合中
//        List<String> newList = arrayList.stream().filter(new Predicate<String>() {
//            @Override
//            public boolean test(String s) {
//                return s.contains("男");
//            }
//        }).collect(Collectors.toList());
//    }// 需求2:把所有的男性收集起来,放到一个Set集合中
//    Set<String> stringSet = arrayList.stream().filter(s -> s.contains("男"))
//            .collect(Collectors.toSet());
//    System.out.println(stringSet);/* 需求3:把所有的男性收集起来,放到一个Map集合中,姓名为键,年龄为值toMap的两个参数:参数一:表示键的生成规则,参数二表示值的生成规则Function<T, R>的两个参数,T 表示流的数据类型,即apply的参数类型;R表示返回的数据类型,即apply的返回类型重要:键不能重复*/Map<String,Integer> map = arrayList.stream().filter(s -> "男".equals(s.split("-")[1])).collect(Collectors.toMap(new Function<String, String>() { // 键的生成规则@Overridepublic String apply(String s) {return s.split("-")[0];}},new Function<String, Integer>() { // 值的生成规则@Overridepublic Integer apply(String s) {return Integer.parseInt(s.split("-")[2]);}}));System.out.println(map);}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/30563.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深度学习增强的非线性光纤单像素成像系统

1、光子器件的逆向设计&#xff1a;通过机器学习&#xff0c;特别是深度学习&#xff0c;可以高效地进行光子器件的逆向设计&#xff0c;这在传统的多参数优化问题中尤为重要。 2、超构表面和超材料设计&#xff1a;机器学习被用于设计具有特定光学特性的超构表面和超材料&…

初阶 《数组》 1. 一维数组的创建和初始化

1. 一维数组的创建和初始化 1.1 数组的创建 数组是一组相同类型元素的集合 数组的创建方式&#xff1a; type_t arr_name [const_n]; //type_t 是指数组的元素类型 //const_n 是一个常量表达式&#xff0c;用来指定数组的大小数组创建的实例&#xff1a; //代码1 int ar…

Wills Room Environment Dormitory Room Environment

有126个独特的网格。包括所有展示的资产和优质资产。具有良好的细节水平,并针对Gameready项目进行了优化。 艺术家Jonjo Hemmens创造的环境 如果想填充你的游戏环境或任何类型的虚拟制作级别,这里有一个包,你可以获得并使用它来得到高质量的视觉效果和优化的资产。 下载:​…

【病毒分析】Steloj勒索病毒分析

1.背景 1.1 来源 近期&#xff0c;Solar团队收到某汽车制造公司的援助请求&#xff0c;该公司的计算机服务器受到了Steloj勒索家族的侵害&#xff0c;所有的文件被加密并且添加了.steloj后缀&#xff0c;该勒索软件的初始入侵方式是MSSQL数据库弱口令进行入侵&#xff0c;后续…

Ubuntu22.04 下安装Curl库

1. apt 安装&#xff1a; sudo apt-get install curl 2. 官网压缩包&#xff1a; 下载地址&#xff1a;curl downloads wget https://curl.haxx.se/download/curl-7.78.0.tar.gz tar -xzvf curl-7.78.0.tar.gz cd curl-7.78.0 ./configure --with-openssl make sudo make i…

前端技术栈二(promise模块化编程)

一、promise 1 Promise 基本介绍 传统的 Ajax 异步调用在需要多个操作的时候&#xff0c;会导致多个回调函数嵌套&#xff0c;导致代码不够直观&#xff0c;就是常说的 Callback Hell 为了解决上述的问题&#xff0c;Promise 对象应运而生&#xff0c;在 EMCAScript 2015 当中…

M1失效后,哪个是观察A股的关键新指标?

M1失效后&#xff0c;哪个是观察A股的关键新指标&#xff1f; 央地支出增速差&#xff08;地方-中央支出增速的差值&#xff09;或许是解释沪深300定价更有效的前瞻指标。该数值扩张&#xff0c;则有利于大盘指数&#xff0c;反之亦然&#xff0c;该指标从2017年至今对大盘指数…

Hedra:让您的照片说话

在数字内容创作的世界里&#xff0c;我们总是在寻找那些能够让我们的作品更加生动和吸引人的工具。Hedra软件就是这样一款工具&#xff0c;它能够让您的照片动起来&#xff0c;甚至说话。想象一下&#xff0c;您的家庭相册中的照片突然变得栩栩如生&#xff0c;或者您的产品图片…

Python微磁学磁倾斜和西塔规则算法

&#x1f4dc;有限差分-用例 &#x1f4dc;离散化偏微分方程求解器和模型定型 | &#x1f4dc;三维热传递偏微分方程解 | &#x1f4dc;特定资产期权价值偏微分方程计算 | &#x1f4dc;三维波偏微分方程空间导数计算 | &#x1f4dc;应力-速度公式一阶声波方程模拟二维地震波…

磁链观测器设计与Simulink建模

1. 磁链观测器设计 如下方程描述了模块输入计算永磁同步电机得电角度&#xff0c;磁通量和电扭矩。 假设 那么&#xff0c;以下拉普拉斯变换表示 Ψα 和 Ψβ 中的积分项&#xff1a; 为了滤除噪声信号&#xff0c;这里使用带低通滤波器得积分器。注意&#xff0c;低通滤波器得…

[笔记] CCD相机测距相关的一些基础知识

1.35mm胶片相机等效焦距 https://zhuanlan.zhihu.com/p/419616729 拿到摄像头拍摄的数码照片后&#xff0c;我们会看到这样的信息&#xff1a; 这里显示出了两个焦距&#xff1a;一个是实际焦距&#xff1a;5mm&#xff0c;一个是等效焦距&#xff1a;25mm。 实际焦距很容易…

OpenGL3.3_C++_Windows(14)

demo演示 demo演示 天空盒 作用&#xff1a;我们想要一个立方体每个面都有不同的纹理&#xff0c;可以在while使用&#xff1a;glActiveTexture&#xff08;&#xff09;&#xff0c;激活绑定相应纹理&#xff0c;glVertexAttribPointer设置布局&#xff0c;glDrawArrays&…

21.0docker企业级镜像仓库harbor(vmware 中国团队)

docker企业级镜像仓库harbor(vmware 中国团队) 网站下载harbor软件包 https://github.com/goharbor/harbor 查看软件安装harbor版本需求限制 本地环境需求已满足 点击下载harbor安装包 点击releases根据版本信息下载 下面的在线安装就是docker pull。离线就是下载之后…

机器学习课程复习

参考书目:《统计学习方法》 选择题 5道 3分/道 填空题 5道 3分/道 简答题 3道 计算题 1道 算法设计题 1道 隐马尔可夫不考计算题 很有可能考计算题的知识点:KNN、决策树、支持向量机、聚类算法 小概率会考计算题的知识点:线性回归(最小二乘法,代公式算参…

23种设计模式之桥接模式

桥接模式 1、定义 桥接模式&#xff1a;将抽象部分与它的实现部分解耦&#xff0c;使得两者都能独立变化 2、桥接模式结构 Abstraction&#xff08;抽象类&#xff09;&#xff1a;它是用于定义抽象类的&#xff0c;通常是抽象类而不是接口&#xff0c;其中定义了一个Imple…

Spark Core内核调度机制详解(第5天)

系列文章目录 如何构建DAG执行流程图 (掌握)如何划分Stage阶段 (掌握)Driver底层是如何运转 (掌握)确定需要构建多少分区(线程) (掌握) 文章目录 系列文章目录引言一、Spark内核调度&#xff08;掌握&#xff09;1.1、内容概述1.2、RDD的依赖1.3、DAG和Stage1.4、Spark Shuffl…

Dockerfile封装制作pytorch(tensorflow)深度学习框架 + jupyterlab服务 + ssh服务镜像

一&#xff1a;docker-hub官网寻找需求镜像 1.我们在https://hub.docker.com/官网找到要封装的pytorch基础镜像&#xff0c;这里我们以pytorch1.13.1版本为例 2.我们找到的这个devel版本的镜像&#xff08;我们需要cuda的编译工具&#xff09; pytorch版本是1.13.1&#xff0c;…

网络校时服务器:铁路对时有妙招

在信息高速发展的今天&#xff0c;铁路作为国家的经济大动脉&#xff0c;与广大市民生活息息相关&#xff0c;担负着运送大流量乘客、保证交通畅通的重任&#xff0c;为了保证列车的正点运行和乘客的行程&#xff0c;对时间精准度的要求是非常严格的。随着我国铁路的发展速度和…

【CRASH】freelist异常导致的异常地址访问

freelist异常导致的异常地址访问 问题现象初步分析继续深入新的发现沙盘推演寻找元凶分析代码后记 问题现象 项目一台设备几天内出现了两次crash&#xff0c;都是异常地址访问导致。 [66005.261660] BUG: unable to handle page fault for address: ffffff8881575110初步分析…

AOSP平台开发的利器——Android Studio for Platform

Android Studio for Platform (ASfP) 是一个为使用 Soong 构建系统构建的 Android 开源项目&#xff08;AOSP&#xff09;平台开发者而设计的 Android Studio IDE 版本。与标准 Android Studio 不同&#xff0c;ASfP 具有多语言支持&#xff0c;可以在同一 IDE 中编写 C、Kotli…