Java学习笔记(20)

可变参数

输入的参数数量不确定

底层就是把输入的参数放进一个数组里

  1. 只能写一个可变参数
  2. 如果还有其他形参,可变参数要放在最后写

可变参数在底层就是一个数组

Collections

Addall shuffle

练习

package exercise;

import java.util.ArrayList;
import java.util.Collections;

public class exercise1 {
    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<>();
        Collections.addAll(list, "11", "22", "#3", "33", "44", "55");

        for (int i = 0; i < 5; i++) {
            Collections.shuffle(list);
            System.out.println("第" + i + "轮:");
            System.out.println(list);
        }
    }
}

package exercise;

import java.util.*;
import java.util.function.BiConsumer;

public class exercise2 {
    public static void main(String[] args) {
        HashMap<String, ArrayList<String>> hm = new HashMap<>();
        ArrayList<String> city1 = new ArrayList<>();
        ArrayList<String> city2 = new ArrayList<>();
        ArrayList<String> city3 = new ArrayList<>();
        Collections.addAll(city1, "南京市", "扬州市", "苏州市", "无锡市", "常州市");
        Collections.addAll(city2, "武汉市", "孝感市", "十堰市", "宜昌市", "鄂州市");
        Collections.addAll(city3, "石家庄市", "唐山市", "邢台市", "保定市", "张家口市");
        hm.put("江苏省", city1);
        hm.put("湖北省", city2);
        hm.put("河北省", city3);

        hm.forEach(new BiConsumer<String, ArrayList<String>>() {
            @Override
            public void accept(String s, ArrayList<String> strings) {
                StringJoiner sj = new StringJoiner(",","","");
                for (String city : strings) {
                    sj.add(city);
                }
                System.out.println(s + " = " + sj);
            }
        });
    }

}

创建不可变集合

不可以被修改的集合

不能改长度,改内容

只能查询

List.of

Set.of里面如果有重复的元素,就会报错

Map.of

参数是有上限的,最多传10个
为什么有上限?

因为map.of参数里传的是一个键,一个值,一个键一个值这样,如果想要写成可变参数,如下面,第一个参数传键的可变参数,第二个传值的可变参数是不行的。因为参数里只允许有一个可变参数,并且传入参数有多个的话,可变参数要放在最后。

所以没法这样写

为了可以传多个键值对,就可以使用map.ofEntries,传递entry对象的可变参数

传多个Entry对象,就可以把多个entry对象放在数组array里

那怎么放?

首先从hashmap中获取所有entry对象的集合set(entryset()方法)

再新建一个entry的数组用于存放

调用entry对象集合的toArray方法,传入参数就是上面建立的entry数组,返回的就是一个装满entry对象的数组

就可以把这个数组放到map.ofEntries的传入参数里,就得到一个不可以修改的map

嫌麻烦?

一行代码

记不住?

直接用

Copyof  JDK10才出现

如果传入的是不可变的map,直接返回

如果不是,则给你转成一个不可变的map

Stream流

单列集合

Arraylist是collection的实现类,继承了里面的stream方法

双列集合

数组

用的是Arrays里面的steam方法

对零散数据使用stream的静态方法Stream.of

要求:数据得是相同类型的

Stream.of在底层其实使用的是Arrays.stream()

注意,如果用stream.of如果传递的是引用数据类型的数组,则可以用

传递基本数据类型的数组,会把数组当做一个元素,返回的是数组的地址值

用包装类就可以实现了

Stream流的中间方法

Filter limit skip distinct concat map

Stream流只能用一次

不会改变原来的集合内容

Distinct 底层是通过new一个hashset来去重的;如果元素是自定义对象,要重写hashcode和equals

.map方法

Lambda表达

Stream终结方法

注意:tolist()不是终结方法

Toarray()是终结方法

收集方法

.collect

Tolist:会把数据放到arraylist中

Toset:会把数据放到hashset中

注意:收集到map里的数据,键不能重复,否则报错

应该收集到一个hashmap中

Lambda写法

ArrayList<Integer> list = new ArrayList<>();
        Collections.addAll(list, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10);

        List<Integer> list1 = list.stream().filter(i -> i % 2 == 1).toList();
        System.out.println(list1);//[1, 3, 5, 7, 9]

ArrayList<String> list2 = new ArrayList<>();
        Collections.addAll(list2, "zhangsan, 23", "lisi, 24", "wangwu, 25");


        Map<String, Integer> map = list2.stream().filter(s -> Integer.parseInt(s.split(", ")[1]) >= 24)
                .collect(Collectors.toMap(s -> s.split(", ")[0], i -> Integer.parseInt(i.split(", ")[1])));
        System.out.println(map);//{lisi=24, wangwu=25}

 //1.创建两个ArrayList集合
        ArrayList<String> manList = new ArrayList<>();
        ArrayList<String> womenList = new ArrayList<>();
        //2.添加数据
        Collections.addAll(manList, "蔡坤坤,24", "叶齁咸,23", "刘不甜,22", "吴签,24", "谷嘉,30", "肖梁梁,27");
        Collections.addAll(womenList, "赵小颖,35", "杨颖,36", "高元元,43", "张天天,31", "刘诗,35", "杨小幂,33");

        Stream<String> stream1 = manList.stream().filter(s -> s.split(",")[0].length() == 3).limit(2);
        Stream<String> stream2 = womenList.stream().filter(s -> s.startsWith("杨")).skip(1);

        List<Actor> list3 = Stream.concat(stream1, stream2)
                .map(s -> new Actor(s.split(",")[0], Integer.parseInt(s.split(",")[1])))
                .toList();
        System.out.println(list3);//[Actor{name = 蔡坤坤, age = 24}, Actor{name = 叶齁咸, age = 23}, Actor{name = 杨小幂, age = 33}]

方法引用

方法引用的分类

引用静态方法

Integer::parseInt

引用成员方法

用this和super引用需要注意:如果当前类是静态static的,则没得用,因为static方法里是没有this的

如果要用,只能先创建本类的对象,再去调用本类的方法

引用构造方法

自己在对象类重写一个构造方法和抽象方法一致,但不需要管返回值,因为构造方法生成的对象和抽象方法的返回值相同就行。

其他调用方式

使用java类名引用成员方法

有局限性

引用数组的构造方法

//1.创建两个ArrayList集合
        ArrayList<String> manList = new ArrayList<>();
        //2.添加数据
        Collections.addAll(manList, "蔡坤坤,24", "叶齁咸,23", "刘不甜,22", "吴签,24", "谷嘉,30", "肖梁梁,27");

        Actor[] array = manList.stream().map(Actor::new).toArray(Actor[]::new);
        System.out.println(Arrays.toString(array));
        //[Actor{name = 蔡坤坤, age = 24}, Actor{name = 叶齁咸, age = 23},
        // Actor{name = 刘不甜, age = 22}, Actor{name = 吴签, age = 24},
        // Actor{name = 谷嘉, age = 30}, Actor{name = 肖梁梁, age = 27}]

String[] array1 = Arrays.stream(array).map(Actor::getName).toArray(String[]::new);
        System.out.println(Arrays.toString(array1));
        //[蔡坤坤, 叶齁咸, 刘不甜, 吴签, 谷嘉, 肖梁梁]

manList.stream().map(new exercise3()::method2).toList().forEach(System.out::println);
        //蔡坤坤-24
        //叶齁咸-23
        //刘不甜-22
        //吴签-24
        //谷嘉-30
        //肖梁梁-27

public String method2(String s) {
        return s.split(",")[0] + "-" + s.split(",")[1];
    }

String[] array2 = Arrays.stream(array).map(Actor::method2).toArray(String[]::new);
System.out.println(Arrays.toString(array2));
//[蔡坤坤-24, 叶齁咸-23, 刘不甜-22, 吴签-24, 谷嘉-30, 肖梁梁-27]

public static String method2(Actor a) {
        return a.getName() + "-" + a.getAge();
    }

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Nacos详解,从安装到服务部署,及nginx反向代理

Nacos 安装 Windows安装 下载 在Nacos的GitHub页面&#xff0c;提供有下载链接&#xff0c;可以下载编译好的Nacos服务端或者源代码&#xff1a; GitHub主页&#xff1a;https://github.com/alibaba/nacos GitHub的Release下载页&#xff1a;https://github.com/alibaba/nacos…

更新数据库表中的数据

目录 update 加上各种限制条件 update update 表名set 列名1xx,列名2xx 指定更新某列数据如果不添加where子句,则为全列更新 也可以在原有基础上更新: 注意,mysql语法里不支持,必须是列名列名数值 加上各种限制条件 比如加上order by子句,where子句,limit等 这些条件对于up…

Flutter 运行 flutter doctor 命令长时间未响应

由于 Flutter 运行 flutter doctor 命令&#xff0c;会从 pub(https://pub.dev/ 类似于 Node.js 的 npm) 上进行资源的下载&#xff0c;如果没有配置国内镜像&#xff0c;可能会由于其服务器在国外导致资源下载慢或者下载不下来&#xff0c;所以出现了运行 flutter doctor 命令…

权限提升-Web权限提升篇划分获取资产服务后台系统数据库管理相互转移

知识点 1、权限提升转移-分类&高低&场景 2、Web权限提升及转移-后台&数据库 3、后台权限及转移-转移对象&后台分类 章节点&#xff1a; 1、Web权限提升及转移 2、系统权限提升及转移 3、宿主权限提升及转移 4、域控权限提升及转移 基础点 0、为什么我们要学…

算法复杂度的介绍

算法复杂度简介 复杂度也叫渐进复杂度&#xff0c;包括时间复杂度和空间复杂度&#xff0c;用来分析算法执行效率与数据规模之间的增长关系&#xff0c;可以粗略地表示&#xff0c;越高阶复杂度的算法&#xff0c;执行效率越低。常见的复杂度并不多&#xff0c;从低阶到高阶有…

API(时间类)

一、Date类 java.util.Date类 表示特定的瞬间&#xff0c;精确到毫秒。 Date常用方法&#xff1a; public long getTime() 把日期对象转换成对应的时间毫秒值。 public void setTime(long time) 把方法参数给定的毫秒值设…

使用布丰投针法精确计算圆周率

如果在平面上有两条距离为d的平行线&#xff0c;假设如果拿一根长度是L的铁针随机的丢到纸面上去&#xff0c;那么试问铁针与某条直线所相交的概率是多少&#xff0c;假设铁针的长度L是大于平行线的距离d的&#xff0c;这样铁针就不会同时与两条直线所相交了。 添加图片注释&am…

文章解读与仿真程序复现思路——中国电机工程学报EI\CSCD\北大核心《基于老化成本实时次梯度的异构储能系统功率分配策略》

本专栏栏目提供文章与程序复现思路&#xff0c;具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源…

如何进行软件测试

1、测试用例带给我们的好处 &#xff08;1&#xff09;测试执行者的依据 &#xff08;2&#xff09;使得工作可重复&#xff0c;自动化测试的基础 &#xff08;3&#xff09;评估需求覆盖率 &#xff08;4&#xff09;用例的复用 &#xff08;5&#xff09;积累测试的方法思…

零代码编程:用kimichat将srt字幕文件进行批量转换合并

文件夹里面有多个srt字幕文件&#xff0c;借助kimichat可以很方便的对其进行批量合并。 在kimichat中输入提示词&#xff1a; 你是一个Python编程专家&#xff0c;写一个Python脚本&#xff0c;完成一个处理整理文档内容的任务&#xff0c;具体步骤如下&#xff1a; 打开文件…

Microsoft Copilot (Bing Chat)

Copilot: Your everyday AI companion &#xff08;你每天的AI伙伴&#xff09; Bing AI - 搜索 Microsoft Copilot: 你的日常 AI 助手 Copilot|Designer: Create images from words with AI https://www.bing.com/images/create 2024 年 1 月 23 日更新&#xff1a; 在微软…

软考高级:软件架构评估-质量属性概念和例题

作者&#xff1a;明明如月学长&#xff0c; CSDN 博客专家&#xff0c;大厂高级 Java 工程师&#xff0c;《性能优化方法论》作者、《解锁大厂思维&#xff1a;剖析《阿里巴巴Java开发手册》》、《再学经典&#xff1a;《Effective Java》独家解析》专栏作者。 热门文章推荐&am…

【Winform学习笔记(十一)】解决无边框窗体最大化显示异常问题

解决无边框窗体最大化显示异常问题 前言正文1、防止改变窗口大小时控件闪烁2、FrmMain_SizeChanged 前言 Winform 无边框窗体的设计&#xff0c;旨在为用户提供更加独特和个性化的界面体验&#xff0c;但是在实现这一设计的过程中&#xff0c;最大化显示异常问题往往成为开发者…

日志集中审计系列(1)--- LogAuditor接收DAS设备syslog日志

日志集中审计系列(1)--- LogAuditor接收DAS设备syslog日志 前言拓扑图设备选型组网需求配置思路操作步骤结果验证前言 近期有读者留言:“因华为数通模拟器仅能支持USG6000V的防火墙,无法支持别的安全产品,导致很多网络安全的方案和产品功能无法模拟练习,是否有真机操作的…

软考高级:软件架构评估-质量属性-安全性概念和例题

作者&#xff1a;明明如月学长&#xff0c; CSDN 博客专家&#xff0c;大厂高级 Java 工程师&#xff0c;《性能优化方法论》作者、《解锁大厂思维&#xff1a;剖析《阿里巴巴Java开发手册》》、《再学经典&#xff1a;《Effective Java》独家解析》专栏作者。 热门文章推荐&am…

Spring AI Embeddings 和 Vector 入门

在前面 Spring AI Chat 简单示例 中介绍了 Chat 的基本用法&#xff0c;本文在此基础&#xff08;主要是pom.xml&#xff09;上继续探索 Embedding 和 Vector。 官方文档&#xff1a; embeddings: https://docs.spring.io/spring-ai/reference/api/embeddings/openai-embedding…

基于Vue的社区旧衣回收利用系统的设计与实现

经济的高速发展使得每一个家庭的收入都获得了大幅增长&#xff0c;随之而来的就是各种梦想的逐步实现&#xff0c;首当其冲的就是各类衣服的更新换代而导致了大量旧衣物在家中的积存。为了帮助人们解决旧衣物处理的问题而以当前主流的互联网技术构建一个可于社区中实现旧衣回收…

VUE+Vant实现H5组织架构选人选公司组件

提醒自己&#xff1a; 这是之前的逻辑&#xff0c;或许你重新写会有更好的方法&#xff0c;可以参考逻辑&#xff01;&#xff01;&#xff01; 功能介绍 1.有面包屑点击切换 2.有公司、部门、人员 3.单选、多选实现 4.编辑/回显 5.使用随意切换层级和跳转到指定层级回显等功…

Spark Rebalance hint的倾斜的处理(OptimizeSkewInRebalancePartitions)

背景 本文基于Spark 3.5.0 目前公司在做小文件合并的时候用到了 Spark Rebalance 这个算子&#xff0c;这个算子的主要作用是在AQE阶段的最后写文件的阶段进行小文件的合并&#xff0c;使得最后落盘的文件不会太大也不会太小&#xff0c;从而达到小文件合并的作用&#xff0c;…

【算法训练营】周测4

清华大学驭风计划课程链接 学堂在线 - 精品在线课程学习平台 (xuetangx.com) 如果需要答案代码可以私聊博主 有任何疑问或者问题&#xff0c;也欢迎私信博主&#xff0c;大家可以相互讨论交流哟~~ 考题11-4 题目描述 输入格式 从标准输入读入数据。 输入第一行为两个正整…