当前位置: 首页 > news >正文

集合的进阶

不可变集合

  • 创建不可变的集合

    • 在创建了之后集合的长度内容都不可以变化

      image-20231011162508117

  • 静态集合的创建在list ,set ,map接口当中都可以获取不可变集合

方法名称说明
static list of(E …elements)创建一个具有指定元素集合list集合对象
staticlist of(E…elements)创建一个具有指定元素的set集合
static<k,v> Map<k,v> of(E…elements)创建一个具有指定元素的Map集合
  • 这个集合是不能删除和修改

  • List集合

/*不能添加修改操作*/
List<String> list = List.of("lishi", "changff", "zhangshan", "wangshang");list.remove("lishi");list.add("shuxili");list.set(0,"bbbb");

image-20231011195529380

  • set集合
  • 注意事项:信息不能重复
package ImmutableDemo;import java.util.Iterator;
import java.util.Set;public class Demo2  {public static void main(String[] args) {Set<String> s=Set.of("lishi", "changff", "zhangshan", "wangshang","dkjkjf");Iterator<String> it = s.iterator();while (it.hasNext() ) {System.out.println(it.next());}System.out.println("---------------");System.out.println("---------------");
//        s.remove("lishi");
//        s.add("shuxili");}
}

image-20231011204058727

  • map集合
  • 注意事项:键值对信息不能重复
package ImmutableDemo;import java.util.Map;
import java.util.Set;public class Demo3 {public static void main(String[] args) {Map<String, String> mapDeom = Map.of("南京", "1000", "北京", "10000", "上海", "8000");Set<String> keySet = mapDeom.keySet();for (String s : keySet) {System.out.println(s);System.out.println(mapDeom.get(s));}System.out.println("---------");Set<Map.Entry<String, String>> entries = mapDeom.entrySet();for (Map.Entry<String, String> entry : entries) {String key = entry.getKey();String value = entry.getValue();System.out.println(key + "=" + value);}}
}
  • Map

由于map集合的特殊,还有一种方法为Map.ofEntries( )方法可以传递多个键值对 对象

package ImmutableDemo;import java.util.HashMap;
import java.util.Map;
import java.util.Set;public class Demo4  {public static void main(String[] args) {HashMap<String,String> h =new HashMap<>();h.put("aaa","111");h.put("bbb","222");h.put("ccc","333");h.put("ddd","444");h.put("eee","555");/*先获取键值对,对像*/Set<Map.Entry<String, String>> entries = h.entrySet();Map.Entry[] array = entries.toArray(new Map.Entry[0]);/*先将键值对对象转化为数组,0长度不会影响,在底层会自动比较,然后转成集合的长度*//*创建不可变集合*/Map map = Map.ofEntries(array);/*可变集合底层是一个数组,可以将数组直接传过去*/
//        map.put("fff","777");
//        map.remove("aaa");/*简写*/Map<Object, Object> map1 = Map.ofEntries(h.entrySet().toArray(new Map.Entry[0]));}
}

image-20231012191153662

总结:

  • 特点:

    定义完成后不可以进行增删改

  • 如何创建不可变集合

image-20231013143055418

  • 三种方式的细节
    image-20231013143315202

Stream流:

  • 思想:工厂流水线,每个负责一项功能,结合lambda表达式来简化对数组的操作

  • Stream流的使用步骤:
    1.得到一条Stream流,并添加数据
    2.使用中间方法对流水线进行操作
    3.使用终结方法结束对Stream的操作例如 sout

    获取方法方法名说明
    单列集合default Stream stream()Collection 中的默认方法
    双列集合无法直接使用stream流
    数组Public static StramStream(T[] array)Arrays工具类中的静态方法调用
    一堆零散数据public staticStream of(T…value)Stream接口中的静态方法
    • 单列集合

        public static void main(String[] args) {/*单列集合直接调用,list是collections的实现类*/ArrayList<String> list =new ArrayList<>();Collections.addAll(list,"A","B","C","E","F","G");list.stream().forEach(s -> System.out.println(s ));}
      
      • 双列集合
        注意事项:不能直接使用,必须转化为单列结合最后(keyset,entery)
        public static void main(String[] args) {HashMap<String,Integer> ha =new HashMap<>();ha.put("aaa",1);ha.put("bbb",2);ha.put("ccc",3);ha.put("ddd",4);ha.put("eee",5);/*获取键值 */ha.keySet().stream().forEach(s -> System.out.println(s));System.out.println();/*获取键值对 对象,*/ha.entrySet().stream().forEach(stringIntegerEntry -> System.out.println(stringIntegerEntry));}		
    
    • 数组

      注意事项:不能直接使用需要借助工具类arrays中的stream流

       /*数组*/public static void main(String[] args) {int[] arr = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};String [] st ={"aaa","bbb","ccc"};/*获取stream流*/Arrays.stream(arr).forEach(s-> System.out.println(s));System.out.println();Arrays.stream(st).forEach(s1 -> System.out.println(s1));}	
      
    • 零散数据
      注意事项:数据的类型必须一致,在添加引用类型的数组是可以直接使用,但是基本数据类型的数组是不能使用的会吧整个数组当成一个元素直接传递到steam流中

      public static void main(String[] args) {Stream.of(1,2,3,4,5,6,7,8,9).forEach(s-> System.out.println(s));}
      

image-20231013165357994

stream流中的中间方法:

image-20231015144806477

  • Filter 过滤
    注意事项:stream流在使用一次后就自动关闭,不能在下面接着使用,建议链式编程
    在stream流中修改了数据,原来集合里面的数据不会发生改变
ArrayList<String> list = new ArrayList<>();Collections.addAll(list, "aaa", "bbb", "ccc", "ddd", "eee");list.stream().filter(new Predicate<String>() {@Overridepublic boolean test(String s) {/*true:留下  false:舍弃*/return s.startsWith("a");}}).forEach(s -> System.out.println(s));/*简化*/list.stream().filter(s -> s.startsWith("a")).forEach(s -> System.out.println(s));
  • Limit 获取前几个元素,limit(个数)

      /*limit获取前几元素,不是索引是元素*/list.stream().limit(4).forEach(s -> System.out.println(s));
  • skip 跳过前几个元素,skip(个数)

    /*skip跳过前几个元素*/list.stream().skip(2).forEach(s -> System.out.println(s));
    

    练习:

    /*练习获取其中3-4*/list.stream().limit(4).skip(2).forEach(s -> System.out.println(s));System.out.println();list.stream().skip(2).limit(2).forEach(s -> System.out.println(s));System.out.println( );
    
    • distinct 去重复,在底层是hashset去重复

       /*去重复*/list1.stream().distinct().forEach(s -> System.out.println(s));/*引用数据类型可以直接,自定义的对象需要重写hascode和equales方法*/

      image-20231015113843368

    • Concat 流合并
      **注意事项:**类型一致,不会提升类型,不一致会提升到俩流的父类,不能使用单独流的特有功能

 /*流合并,类型一致,不会提升类型,不一致会提升到俩流的父类,不能使用单独流的特有功能*/Stream.concat(list1.stream().distinct(),list.stream()).forEach(s -> System.out.println(s));

Map 流的转换:

 /*流的转换*/list2.stream().map(new Function<String, Integer>() {/*string表示流里面原来就有的数据* integer表示的是要转换了之后的类型*/@Overridepublic Integer apply(String s) {String[] split = s.split("-");/*切割方法split*/String s1 = split[1];int i = Integer.parseInt(s1);/*integer中的转换方法*/return i;}}).forEach(s -> System.out.println(s));System.out.println("================================");/*简化*/list2.stream().map(s -> Integer.parseInt(s.split("-")[1])).forEach(s-> System.out.println(s));

终结方法:

image-20231015144922634

  • 遍历
/*遍历方式*/list2.stream().forEach(s -> System.out.println(s));
  • 统计

    /*将Stream流中的数据进行统计*/System.out.println(list2.stream().distinct().count());
    
  • 收集流中的数据放到数组中

    String[] array = list2.stream().toArray(new IntFunction<String[]>() {@Overridepublic String[] apply(int value) {return new String[value];}});System.out.println(Arrays.toString(array));/*简化*/String[] array1 = list2.stream().toArray(value -> new String[value]);System.out.println(Arrays.toString(array));
  • 收集流中的数据放到集合里面

    注意事项:

    lis集合是不会去重复的

    set集合是会去重复的

    map里面的键值对不能重复

    /*list*/List<String> collect = list2.stream().filter(s -> "男".equals(s.split("-")[2])).collect(Collectors.toList());System.out.println(collect);/*set*/Set<String> collect1 = list2.stream().filter(s -> "男".equals(s.split("-")[2])).collect(Collectors.toSet());System.out.println(collect1);/*迭代器遍历*/Iterator<String> iterator = collect.iterator();while (iterator.hasNext()) {System.out.println(iterator.next());}/*增强for*/for (String s : collect) {System.out.println(s);}/*foreach*/collect.forEach((s)-> {  System.out.println(s); });/*收集到map集合当中注意键值对不能重复*/Map<String, Integer> mapcollect = list2.stream().filter(s -> "男".equals(s.split("-")[2]))/*在map集合里面要传递2个数据,键的获取规则,值的获取规则*//*在键或者值里面有2个类型第一个表示流里面的类型,第二个表示键或者值里面的类型,他们是交叉对应的*/.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("-")[1]);}}));/*简化*/Map<String, Integer> mapcollect2 = list2.stream().filter(s -> "男".equals(s.split("-")[2])).collect(Collectors.toMap(s -> s.split("-")[0],s -> Integer.parseInt(s.split("-")[1])));System.out.println(mapcollect2);System.out.println(mapcollect);
    

总结:

image-20231015173045971

相关文章:

集合的进阶

不可变集合 创建不可变的集合 在创建了之后集合的长度内容都不可以变化 静态集合的创建在list &#xff0c;set &#xff0c;map接口当中都可以获取不可变集合 方法名称说明static list of(E …elements)创建一个具有指定元素集合list集合对象staticlist of(E…elements)创…...

【LeetCode刷题(数据结构与算法)】:数据结构中的常用排序实现数组的升序排列

现在我先将各大排序的动图和思路以及代码呈现给大家 插入排序 直接插入排序是一种简单的插入排序法&#xff0c;其基本思想是&#xff1a; 把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中&#xff0c;直到所有的记录插入完为 止&#xff0c;得到一个…...

【HTML+CSS】零碎知识点

公告滚动条 <!DOCTYPE html> <html><head><title>动态粘性导航栏</title><style>.container {background: #00aeec;overflow: hidden;padding: 20px 0;}.title {float: left;font-size: 20px;font-weight: normal;margin: 0;margin-left:…...

嵌入式开发学习之STM32F407串口(USART)收发数据(三)

嵌入式开发学习之STM32F407串口&#xff08;USART&#xff09;收发数据&#xff08;三&#xff09; 开发涉及工具一、选定所使用的串口二、配置串口1.配置串口的I/O2.配置串口参数属性3.配置串口中断4.串口中断在哪里处理5.串口如何发送字符串 三、封装串口配置库文件1.创建头文…...

python:talib.BBANDS 画股价-布林线图

python 安装使用 TA_lib 安装主要在 http://www.lfd.uci.edu/~gohlke/pythonlibs/ 这个网站找到 TA_Lib-0.4.24-cp310-cp310-win_amd64.whl pip install /pypi/TA_Lib-0.4.24-cp310-cp310-win_amd64.whl 编写 talib_boll.py 如下 # -*- coding: utf-8 -*- import os impor…...

ESP32网络开发实例-自定义主机名称

自定义主机名称 文章目录 自定义主机名称1、软件准备2、硬件准备3、代码实现ESP32 的默认主机名是 expressif。 但是,如果正在使用多个 ESP32 设备,并且在某些时候希望在软接入点模式下使用它们时通过名称来区分设备。 例如,在基于物联网的项目中有多个节点,例如温度、湿度…...

【ELK 使用指南 3】Zookeeper、Kafka集群与Filebeat+Kafka+ELK架构(附部署实例)

EFLKK 一、Zookeeper1.1 简介1.2 zookeeper的作用1.3 Zookeeper的特点1.5 Zookeeper的数据结构1.6 Zookeeper的应用场景1.7 Zookeeper的选举机制&#xff08;重要&#xff09;1.7.1 第一次启动时1.7.2 非第一次启动时 二、Zookeeper集群部署2.1 安装前准备2.2 安装 ZookeeperSt…...

手写redux的connect方法, 使用了subscribe获取最新数据

一. 公共方法文件 1. connect文件 import React, { useState } from "react"; import MyContext from "./MyContext"; import _ from "lodash";// 模拟react-redux的 connect高阶函数 const connect (mapStateToProps, mapDispatchToProps) &…...

数据结构--B树

目录 回顾二叉查找树 如何保证查找效率 B树的定义 提炼 B树的插入和删除 概括B树的插入方法如下 B树的删除 导致删除时&#xff0c;结点不满足关键字的个数范围时&#xff08;需要借&#xff09; 如果兄弟不够借&#xff0c;需要合体 回顾B树的删除 B树 B树的查找 …...

【音视频|ALSA】基于alsa-lib开发ALSA应用层程序--附带源码

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; &#x1f923;本文内容&#x1f923;&a…...

嵌入式养成计划-43----QT QMainWindow中常用类的使用--ui界面文件--资源文件的添加--信号与槽

一百零九、QMainWindow中常用类的使用 109.1 菜单栏 QMenuBar 菜单栏 QMenuBar 最多只能有一个 109.2 工具栏 QToolBar 工具栏 QToolBar 可以有多个 109.3 状态栏QStatusBar 状态栏 QStatusBar 最多只能有一个 109.4 浮动窗口QDockWidget 浮动窗口 可以有多个 109.5 代…...

【Yarn】清除Yarn的缓存,更新Yarn本身、更新项目的依赖项

要清除Yarn的缓存&#xff0c;可以运行以下命令&#xff1a; yarn cache clean这将清除Yarn的缓存目录。 要更新Yarn本身&#xff0c;可以运行以下命令&#xff1a; yarn self-update这将下载并安装最新版本的Yarn。 如果要更新项目的依赖项&#xff0c;可以运行以下命令&a…...

点云从入门到精通技术详解100篇-雨雾环境下多传感器融合SLAM方法(续)

目录 4 基于球面投影的激光视觉融合里程计 4.1 引言 4.2 视觉惯性里程计 4.2.1特征点提取与匹配...

解决GET请求入参@NotNull验证不生效问题

一、问题 get请求NotNull验证不生效 二、解决方案 两个步骤&#xff1a; 在该方法的controller类上加Validated&#xff1b;在参数面前加NotNull&#xff1b; 三、其他注解 //被注释的元素必须为null Null //被注释的元素不能为null NotNull //被注释的元素必须为true Ass…...

《golang设计模式》第三部分·行为型模式-01-责任链模式(Chain of Responsibility)

文章目录 1 概念1.1 角色1.2 类图 2. 代码示例2.1 设计2.2 代码2.3 类图 1 概念 责任链&#xff08;Chain of Responsibility&#xff09;是指将客户端请求处理的不同职责对象组成请求处理链。 客户端只需要将请求交付到该链上&#xff0c;而不需要关心链上含有哪些对象。请求…...

环境变量【使用命令行参数引出环境变量】

前提&#xff1a;命令行参数 大家在写C/C程序的时候肯定见过下面这种情况&#xff1a; main函数里面携带的参数&#xff0c;平常写代码过程中很少用到这两个参数&#xff0c;接下来我们就研究一下 我们也不知道 指针数组argv里面到底保存的是什么&#xff0c;也不知道这个a…...

【Java 进阶篇】JavaScript BOM History 详解

当用户浏览网页时&#xff0c;可以使用JavaScript的BOM (Browser Object Model)中的History对象来访问浏览器的历史记录。这个对象允许您在不更改页面的情况下导航到不同的历史记录项&#xff0c;或者查看有关用户访问过的页面的信息。 在本篇博客中&#xff0c;我们将围绕Jav…...

【计算机网络】https协议

文章目录 1 :peach:基本概念:peach:1.1 :apple:什么是HTTPS&#xff1f;:apple:1.2 :apple:什么是加密&#xff1f;:apple:1.3 :apple:常见的加密方式:apple:1.3.1 :lemon:对称加密:lemon:1.3.2 :lemon:⾮对称加密:lemon: 1.4 :lemon:数据指纹:lemon: 2 :peach:HTTPS的⼯作过程…...

React之受控组件和非受控组件以及高阶组件

一、受控组件 受控组件&#xff0c;简单来讲&#xff0c;就是受我们控制的组件&#xff0c;组件的状态全程响应外部数据 举个简单的例子&#xff1a; class TestComponent extends React.Component {constructor (props) {super(props);this.state { username: lindaidai }…...

中国移动集采120万部,助推国产5G赶超iPhone15

近期媒体纷纷传出消息指中国移动将大规模集采&#xff0c;预计将采购国产5G手机120万台&#xff0c;加上另外两家运营商的集采数量&#xff0c;估计集采数量可能达到300万部&#xff0c;如此将有助于它在国内高端手机市场赶超苹果。 国产5G手机在8月底突然上市&#xff0c;获益…...

装饰模式(Decorator Pattern)重构java邮件发奖系统实战

前言 现在我们有个如下的需求&#xff0c;设计一个邮件发奖的小系统&#xff0c; 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式&#xff08;Decorator Pattern&#xff09;允许向一个现有的对象添加新的功能&#xff0c;同时又不改变其…...

Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例

使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件&#xff0c;常用于在两个集合之间进行数据转移&#xff0c;如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model&#xff1a;绑定右侧列表的值&…...

使用分级同态加密防御梯度泄漏

抽象 联邦学习 &#xff08;FL&#xff09; 支持跨分布式客户端进行协作模型训练&#xff0c;而无需共享原始数据&#xff0c;这使其成为在互联和自动驾驶汽车 &#xff08;CAV&#xff09; 等领域保护隐私的机器学习的一种很有前途的方法。然而&#xff0c;最近的研究表明&…...

如何为服务器生成TLS证书

TLS&#xff08;Transport Layer Security&#xff09;证书是确保网络通信安全的重要手段&#xff0c;它通过加密技术保护传输的数据不被窃听和篡改。在服务器上配置TLS证书&#xff0c;可以使用户通过HTTPS协议安全地访问您的网站。本文将详细介绍如何在服务器上生成一个TLS证…...

什么是EULA和DPA

文章目录 EULA&#xff08;End User License Agreement&#xff09;DPA&#xff08;Data Protection Agreement&#xff09;一、定义与背景二、核心内容三、法律效力与责任四、实际应用与意义 EULA&#xff08;End User License Agreement&#xff09; 定义&#xff1a; EULA即…...

NFT模式:数字资产确权与链游经济系统构建

NFT模式&#xff1a;数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新&#xff1a;构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议&#xff1a;基于LayerZero协议实现以太坊、Solana等公链资产互通&#xff0c;通过零知…...

成都鼎讯硬核科技!雷达目标与干扰模拟器,以卓越性能制胜电磁频谱战

在现代战争中&#xff0c;电磁频谱已成为继陆、海、空、天之后的 “第五维战场”&#xff0c;雷达作为电磁频谱领域的关键装备&#xff0c;其干扰与抗干扰能力的较量&#xff0c;直接影响着战争的胜负走向。由成都鼎讯科技匠心打造的雷达目标与干扰模拟器&#xff0c;凭借数字射…...

vue3+vite项目中使用.env文件环境变量方法

vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量&#xff0c;这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...

Maven 概述、安装、配置、仓库、私服详解

目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...

使用Matplotlib创建炫酷的3D散点图:数据可视化的新维度

文章目录 基础实现代码代码解析进阶技巧1. 自定义点的大小和颜色2. 添加图例和样式美化3. 真实数据应用示例实用技巧与注意事项完整示例(带样式)应用场景在数据科学和可视化领域,三维图形能为我们提供更丰富的数据洞察。本文将手把手教你如何使用Python的Matplotlib库创建引…...