Java9集合类新增功能

news2024/10/7 3:17:09

前言

Java8及Java9在集合Collection类中新增了一些很好用的新方法,能方便程序员更便捷的处理集合数据,本文对其中的一些方法进行总结

一. List

请添加图片描述

1.创建

        // 传统方法
        List<String> list1 = new ArrayList<>();
        list1.add("item1");
        list1.add("item2");

        //方法2-子类
        List<String> list2 = new ArrayList<String>() {
            {
                add("item1");
                add("item2");
            }
        };
        
        //方法3:Arrays.asList()罗列元素,不可增删,但可更改
        List<String> list3 = Arrays.asList("item1", "item2");
        
        //方法4:Java9以上新增,不可增删改
        List.of("item1", "item2");

2.更新

        //replaceAll()对元素进行批量替换,本例为在原每个元素String后面增加三个星号
        list1.replaceAll(item -> item + "***");            //更新原List,对象类型不变,所以入参应为Operator:T->T
        System.out.println(list1);

3.判断条件式移除

        //removeIf() 满足条件则移除
        list1.removeIf(item -> item.contains("2"));         //过滤掉含有“2”的元素,list发生改变
        System.out.println(list1);

4. 遍历

        //foreach()循环元素每个对象,放入Customer方法中消费
        list1.forEach(System.out::println);

二. Set

请添加图片描述

        //Set工厂, Java9提供
        Set<String> set = Set.of("item1", "item2");

三. Map

请添加图片描述

1.创建

        //Map工厂,Java9提供,以key、value的格式依次设置参数
        Map<String, String> map1 = Map.of("key1", "value1", "key2", "value2");

        //以Map.entry()格式来创建key、value
        Map<String, Integer> map2 = Map.ofEntries(
                Map.entry("key1", 1),
                Map.entry("key2", 2),
                Map.entry("key3", 3));

2. 替换更新replace()/replaceAll()

        //replace()条件替换
        String key1 = "key1";
        boolean replace = map.replace(key1, 1, 3);
        System.out.println("key5执行computeIfPresent后,结果值:" + map.get(key1));     //执行结果:5,上面的replace没有生效
        

        //replaceAll()全量替换
        map.replaceAll((key, value)-> value + 2);
        System.out.println("key5执行computeIfPresent后,结果值:" + map);           //执行结果:value都增加了2

3.判断条件移除remove()

        /*  remove(key, value): 当map中对应的key->value值时,才会被remove;会结合value一起进行判断 */
        String key2 = "key2";
        boolean remove = map.remove(key2, 2);       //此时key2已经被改为4,因此remove不生效
        System.out.println("移除结果:" + remove);   //执行结果:false

        remove = map.remove(key2, 4);
        System.out.println("移除结果:" + remove);   //此次执行结果:true

4. 遍历forEach()

        //forEach() 以Entry方式来遍历
        map.forEach((key, value) -> {
            System.out.println("key=" + key + ", value=" + value);
        });

5. 排序

        /*用流的方式进行排序*/
        //sorted() 按某种条件排序
        Stream<Map.Entry<String, Integer>> stream = map.entrySet().stream();
        //按照value排序,类似的还有Map.Entry.comparingByKey
        Stream<Map.Entry<String, Integer>> stream1 = stream.sorted(Map.Entry.comparingByValue());
        System.out.println("Map.Entry.comparingByValue 进行排序:");
        stream1.forEachOrdered(System.out::println);

6. 带默认值获取getOrDefault()

       /*  从map中取值,若取不到则返回默认值 */
        String key4 = "key4";
        Integer value4 = map.getOrDefault(key4, 14);     //取key,如果取不到则返回第二个参数,默认值
        System.out.println("getOrDefault执行后,得到的结果:" + value4);      //执行结果:14

7. computer计算

    /**
     * 先定义一个生成value的方法
     */
    public int createValue(String key) {
        String substring = key.substring(3);
        System.out.println("== createValue方法创建value值,key=" + key);
        return Integer.valueOf(substring);
    }


	public void computerTest() {

        /*  computeIfAbsent(): 指定的键没有对应的值,则使用该键计算新的值, 并添加到Map中 */
        Integer value4 = map.computeIfAbsent(key4, this::createValue);    //执行此步骤可以看到value为createValue()执行了,有内部日志打印出来
        System.out.println("computeIfAbsent执行后,结果值:" + value4);     //可以看到value4的结果为:4
        System.out.println("map现在可以取值:" + map.get(key4));           //直接查询map也能得到结果:4

        // 如果指定的键在map中已有,那么直接取值,不会再调用方法参数创建新值。
        Integer value4Again = map.computeIfAbsent(key4, this::createValue);    //执行此步骤,没有createValue()方法内部日志打印出来
        System.out.println("再次执行computeIfAbsent,结果值:" + value4Again);  //执行结果:4


        /*  computeIfPresent(): 指定的键有对应的值,则使用该键计算新的值, 并添加到Map中 */
        //定义的BiFunction,可以把原数据的key-value都传入,计算新value
        BiFunction<String, Integer, Integer> add10Function = (key, value) -> value + 5;
        Integer computeIfPresent2 = map.computeIfPresent(key4, add10Function);      //因为key4已有值,所以会被重算
        System.out.println("Key4执行computeIfPresent后,结果值:" + computeIfPresent2);     //执行结果:9

        //若不存在,则不执行,返回null;因为key5在map中没有对应value,所以没有计算
        String key5 = "key5";
        Integer value5 = map.computeIfPresent(key5, add10Function);            
        System.out.println("key5执行computeIfPresent后,结果值:" + value5);     //执行结果:null
   }

8. 合并

        /*merge() 合并两个map,会根据key以及给出的方法做整合*/
       Map<String, Integer> map = new HashMap<>(Map.ofEntries(
                Map.entry("key1", 5),
                Map.entry("key2", 2),
                Map.entry("key3", 3)));
        Map<String, Integer> map2 = new HashMap<>(Map.ofEntries(
                Map.entry("key1", 1),
                Map.entry("key2", 2),
                Map.entry("key5", 3)));
        //将map2合并入map中
        map2.forEach((k, v) -> map.merge(k, v, (v1, v2) -> v1 + v2));
        System.out.println(map);           //{key1=6, key2=4, key5=3, key3=3} ,以key为基准,做了合并

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

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

相关文章

论文导读 | Operation ResearchManagement Science近期文章精选

推文作者&#xff1a;周梓渊 编者按 本期我们选取了最近来自Operation Research和Management Science的六篇文章以飨读者&#xff0c;前四篇文章来自OR&#xff0c;最后两篇文章来自MS&#xff1b;内容涉及多个方面&#xff0c;实现了方法论与具体应用实践的结合&#xff0c;例…

Node.js HTTP 模块的内存泄露问题

很久没有逛社区了&#xff0c;晚上回来看了一下最近的情况&#xff0c;突然看到一个内存泄露问题&#xff0c;作为一个 APM 开发者&#xff0c;自然想分析其中的原因。 问题 下面介绍一下具体的问题。看一下 demo。 const http require(http)async function main () {let i…

用NumPy,梯度下降的方法来解决线性回归

import matplotlib.pyplot as plt import numpy as npdef reckonCost(X,y,theta):my.shape[0]innernp.power( ( (Xtheta)-y.T ) , 2)return np.sum(inner) / (2*m)# 定义梯度下降函数 def gradient_descent(X, y, theta, alpha, num_iters):# m len(y) # 样本数量my.shape[0]…

Leetcode-每日一题【86.分隔链表】

题目 给你一个链表的头节点 head 和一个特定值 x &#xff0c;请你对链表进行分隔&#xff0c;使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前。 你应当 保留 两个分区中每个节点的初始相对位置。 示例 1&#xff1a; 输入&#xff1a;head [1,4,3,2,5,2], x 3输…

【数据挖掘】时间序列教程【三】

2.7 平稳性 序列的平稳性 是一个关键属性&#xff0c;它允许我们应用许多时间序列分析的标准工具。 如果对于大小 n 和任何整数 ,观察发现 具有与 相同的联合分布&#xff0c;则时间序列是严格平稳的。 换句话说&#xff0c;从分布的角度来看&#xff0c;平稳时间序列对移位…

【嵌入式Qt开发入门】初识信号与槽

信号与槽&#xff08;Signal & Slot&#xff09;是 Qt 编程的基础&#xff0c;也是 Qt 的一大创新。因为有了信号与槽的编程机制&#xff0c;在 Qt 中处理界面各个组件的交互操作时变得更加直观和简单。 信号&#xff08;Signal&#xff09;就是在特定情况下被发射的事件&a…

【Linux】C++项目实战-高并发服务器详析

目录 多进程实现并发服务器多线程实现并发服务器BIO模型NIO模型I/O多路复用(I/O多路转接)select主旨思想图解原理函数解析代码举例select的缺点 poll函数解析代码示例 epoll&#xff08;最重要&#xff0c;请重点掌握&#xff09;函数解析代码举例epoll的两种工作模式 橙色 多…

GO语言使用最简单的UI方案govcl

接触go语言有一两年时间了。 之前用Qt和C#写过桌面程序&#xff0c;C#会被别人扒皮&#xff0c;极度不爽&#xff1b;Qt默认要带一堆dll&#xff0c;或者静态编译要自己弄或者找库&#xff0c;有的库还缺这缺那&#xff0c;很难编译成功。 如果C# winform可以编译成二进制原生…

Android 应用层 到 HAL 层

Android 应用层 到 HAL 层 1、相关知识点1.1 概要1.2 参考 2、拿SensorService举例2.1 Android Apps > Android Framework阶段2.2 Android Framework内部阶段2.2.1 frameworks/base2.2.2 frameworks/native 2.3 Android Framework > HAL 阶段2.3.1 旧版 HAL 1、相关知识点…

前段搜索框不请求接口隐藏数据

项目介绍&#xff1a;uview-ui 1.x的&#xff0c;并且使用语言切换功能&#xff08;i18n&#xff0c;hbuilder新建项目选择i18n项目&#xff09;&#xff0c;因为是h5项目&#xff0c;所以使用location.reload()进行刷新 效果图&#xff1a; 主要判断在 v-if“!keyword || i…

Git 之 reset --hard 回退/回滚到之前的版本代码后,后悔了,如何在恢复之后的版本的方法简单整理

Git 之 reset --hard 回退/回滚到之前的版本代码后&#xff0c;后悔了&#xff0c;如何在恢复之后的版本的方法简单整理 目录 Git 之 reset --hard 回退/回滚到之前的版本代码后&#xff0c;后悔了&#xff0c;如何在恢复之后的版本的方法简单整理 一、简单介绍 二、操作步骤…

Redis是什么?(详细安装步骤)

一、Redis简介&#x1f349; 背景 在Web应用发展的初期&#xff0c;那时关系型数据库受到了较为广泛的关注和应用&#xff0c;原因是因为那时候Web站点基本上访问和并发不高、交互也较少。而在后来&#xff0c;随着访问量的提升&#xff0c;使用关系型数据库的Web站点多多少少…

代码随想录二刷 day38 | 动态规划之 509. 斐波那契数 70. 爬楼梯 746. 使用最小花费爬楼梯

day38 509. 斐波那契数1 确定dp数组以及下标的含义2 确定递推公式3 dp数组如何初始化4 确定遍历顺序5 举例推导dp数组 70. 爬楼梯1 确定dp数组以及下标的含义2 确定递推公式3 dp数组如何初始化4 确定遍历顺序5 举例推导dp数组 746. 使用最小花费爬楼梯1 确定dp数组以及下标的含…

Golang每日一练(leetDay0113) 奇偶链表、链表随机节点

目录 328. 奇偶链表 Odd Even Linked-list &#x1f31f;&#x1f31f; 382. 链表随机节点 Llinked-list Random Node &#x1f31f;&#x1f31f; &#x1f31f; 每日一练刷题专栏 &#x1f31f; Rust每日一练 专栏 Golang每日一练 专栏 Python每日一练 专栏 C/C每日…

docker安装php GD库

故事是这样的&#xff1a; 公司采购了一套商城源码&#xff0c;使用的是 TP5&#xff0c;同事先行&#xff0c;用宝塔部署到生产环境&#xff0c;运行正常。后面我忙完手里的项目&#xff0c;也加入其中&#xff0c;我本地使用的是 docker 当我部署好开始运行时&#xff0c;发…

初学mybatis(三)ResultMap及分页

学习回顾&#xff1a;初学mybatis&#xff08;二&#xff09; 一、查询为null问题 要解决的问题&#xff1a;属性名和字段名不一致 环境&#xff1a;新建一个项目&#xff0c;将之前的项目拷贝过来 1、查看之前的数据库的字段名 2、Java中的实体类设计 public class User {pri…

Redis各数据类型操作命令

一、Redis数据类型及命令 &#xff08;一&#xff09;String 类别命令描述命令示例备注取/赋值操作赋值set key valueset lclkey lclvalue取值 get keyget lclkey取值并赋值getset key valuegetset lclkey1 lclvalue1获取原值&#xff0c;并设置新的值仅当不存在时赋值setnx k…

服务器解析漏洞与cms靶场搭建教程

文章目录 一、解析漏洞定义二、Kali安装docker并搭建DVWA靶场三、Win7 IIS7漏洞复现四、BEES靶场搭建五、CPMS靶场搭建六、SDCMS靶场搭建 一、解析漏洞定义 解析漏洞主要是一些特殊文件被Apache、IIS、Nginx等Web服务器在某种情况下解释成脚本文件格式并得以执行而产生的漏洞 …

The Company Requires Superficial StudyPHP 变量的使用 ③

作者 : SYFStrive 博客首页 : HomePage &#x1f4dc;&#xff1a; PHP MYSQL &#x1f4cc;&#xff1a;个人社区&#xff08;欢迎大佬们加入&#xff09; &#x1f449;&#xff1a;社区链接&#x1f517; &#x1f4cc;&#xff1a;觉得文章不错可以点点关注 &#x1f44…

基于Java电动车租赁网站设计实现(源码+lw+部署文档+讲解等)

博主介绍&#xff1a;✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…