高效使用Map的“新”方法

个人名片:
😊作者简介:一个为了让更多人看见许舒雅的宝贝的小白先生
🤡个人主页:🔗 许舒雅的宝贝
🐼座右铭:深夜两点半的夜灯依旧闪烁,凌晨四点的闹钟不止你一个。
🎅学习目标: 坚持前端的学习进度,做一个全栈开发工程师

Map的数据操作,你是不是还只会put、get方法?

Map是我们日常变成中十分常用的数据接口,在JDK8中,Map引入了几个新方法,可以简化我们在实际写代码过程中对Map的数据操作。

目录

🌟1.getOrDefault方法

🌟2. foreach

🌟3.merge

🌟4.putIfAbsent

🌟5.computer

🌟6.computeIfAbsent

🌟7.computeIfPresent


🌟1.getOrDefault方法

使用 getOrDefault 方法获取键为 "key1" 的值,如果不存在则返回默认值 "defaultValue"

public class MapTest {

    public static void main(String[] args) {
        // 测试 put() 方法
        testGetOrDefault();
    }

    private static void testGetOrDefault() {
        Map<String, String> map = new HashMap<>();
        map.put("key1", "value1");
        map.put("key2", "value2");

        // 使用 getOrDefault 方法获取键为 "key1" 的值,如果不存在则返回默认值 "defaultValue"
        String value = map.getOrDefault("key3", "defaultValue");
        System.out.println(value); // 输出: value1
    }
}

🌟2. foreach

使用 forEach 方法遍历 Map 中的键值对

    public static void main(String[] args) {
        // 测试 testGetOrDefault() 方法
        // testGetOrDefault();
        // 测试testForeach()方法
        testForeach();
    }

    private static void testForeach() {
        Map<String, String> map = new HashMap<>();
        map.put("key1", "value1");
        map.put("key2", "value2");

        // 使用 forEach 方法遍历 Map 中的键值对
        map.forEach((key, value) -> {
            System.out.println("Key: " + key + ", Value: " + value);
        });
    }
}

🌟3.merge

使用 merge 方法合并键为 "key1" 的值,如果键不存在则添加新的键值对

    public static void main(String[] args) {
        // 测试 testGetOrDefault() 方法
        // testGetOrDefault();
        // 测试testForeach()方法
        // testForeach();
        // 测试testMerge()方法
        testMerge();
    }

    private static void testMerge(){
        Map<String, String> map = new HashMap<>();
        map.put("key1", "value1");
        map.put("key2", "value2");

        // 使用 merge 方法合并键为 "key1" 的值,如果键不存在则添加新的键值对
        map.merge("key1", "newValue", (oldValue, newValue) -> oldValue + " " + newValue);
        System.out.println(map.get("key1")); // 输出: value1 newValue
    }
}

🌟4.putIfAbsent

putIfAbsent()方法的作用是,如果指定的键不存在于映射中,则将指定的键值对添加到映射中。

    public static void main(String[] args) {
        // 测试 testGetOrDefault() 方法
        // testGetOrDefault();
        // 测试testForeach()方法
        // testForeach();
        // 测试testMerge()方法
        // testMerge();
        // 测试testPutIfAbsent()方法
        testPutIfAbsent();
    }

    //putIfAbsent()方法的作用是,如果指定的键不存在于映射中,则将指定的键值对添加到映射中。
    private static void testPutIfAbsent() {
        Map<String, String> map = new HashMap<>();
        map.put("key1", "value1");
        map.put("key2", "value2");

        // 使用 putIfAbsent 方法添加键值对,如果键不存在则添加新的键值对
        map.putIfAbsent("key3", "value3");
        map.putIfAbsent("key2", "newValue");

        System.out.println(map.get("key3")); // 输出: value3
        System.out.println(map.get("key2")); // 输出: value2
    }
}

🌟5.computer

computer()方法的作用是计算指定键的哈希码,并返回计算结果。

computer方法需要传入2个参数:key、function。主要有3步操作

  • 获取到key对应的oldValue,可能为null

  • 经过function计算获取newValue

  • put(key, newValue)

  public static void main(String[] args) {
        // 测试 testGetOrDefault() 方法
        // testGetOrDefault();
        // 测试testForeach()方法
        // testForeach();
        // 测试testMerge()方法
        // testMerge();
        // 测试testPutIfAbsent()方法
        // testPutIfAbsent();
        // 测试testComputer()方法
        testComputer();
    }

    //computer()方法的作用是计算指定键的哈希码,并返回计算结果。
    private static void testComputer() {
        Map<String, Integer> map = new HashMap<>();
        List<String> keys = Arrays.asList("apple","orange","banana","orange");

        for (String itemString : keys) {
            map.compute(itemString, (k,v)->{
                if(v==null){
                    v=1;
                }else{
                    v += 1;
                }
                return v;
            });
        }
        for (Map.Entry<String, Integer> entry : map.entrySet()) {
            System.out.println(entry.getKey() + " : " + entry.getValue());
        }
    }
}

🌟6.computeIfAbsent

compute方法衍生出来的方法,这个方法只在key不存在的时候,执行computer计算,如果说key对应的value存在,就直接返回这个value。

我们需要计算斐波那锲数列的时候,可以使用这个方法来简化代码

    public static void main(String[] args) {
        // 测试 testGetOrDefault() 方法
        // testGetOrDefault();
        // 测试testForeach()方法
        // testForeach();
        // 测试testMerge()方法
        // testMerge();
        // 测试testPutIfAbsent()方法
        // testPutIfAbsent();
        // 测试testComputer()方法
        // testComputer();
        // 测试testComputeIfAbsent()方法
        testComputeIfAbsent();
    }

    //computeIfAbsent()方法的作用是,如果指定的键不存在于映射中,则将指定的键值对添加到映射中。
    private static void testComputeIfAbsent() {
        Map<Integer,Integer> map = new HashMap<>();
        map.put(0, 1);
        map.put(1, 1);
        System.out.println(fab(5,map));
    }
    private static int fab(int n,Map<Integer,Integer> map){
        return map.computeIfAbsent(n, k->fab(n-1,map)+fab(n-2,map));//n-1和n-2是递归的条件,k是递归的参数,k->fab(n-1,map)+fab(n-2,map)是递归的公式,k是递归的参数,k->fab(n-1,map)+fab(n-2,map)是递归的公式。
    }
}

🌟7.computeIfPresent

computeIfPresent()方法的作用是,如果指定的键存在于映射中,则计算指定键的值,并将计算结果更新到映射中。

    public static void main(String[] args) {
        // 测试 testGetOrDefault() 方法
        // testGetOrDefault();
        // 测试testForeach()方法
        // testForeach();
        // 测试testMerge()方法
        // testMerge();
        // 测试testPutIfAbsent()方法
        // testPutIfAbsent();
        // 测试testComputer()方法
        // testComputer();
        // 测试testComputeIfAbsent()方法
        // testComputeIfAbsent();
        // 测试testComputeIfPresent()方法
        testComputeIfPresent();
    }

    //computeIfPresent()方法的作用是,如果指定的键存在于映射中,则计算指定键的值,并将计算结果更新到映射中。
    private static void testComputeIfPresent() {
        Map<String, Integer> map = new HashMap<>();
        map.put("apple", 1);
        map.put("orange", 2);
        map.put("banana", 3);

        // 使用 computeIfPresent 方法计算指定键的值,并将计算结果更新到映射中
        map.computeIfPresent("apple", (key, value) -> value * 2);
        map.computeIfPresent("orange", (key, value) -> value * 2);
        map.computeIfPresent("banana", (key, value) -> value * 2);

        // 输出更新后的映射
        for (Map.Entry<String, Integer> entry : map.entrySet()) {
            System.out.println(entry.getKey() + " : " + entry.getValue());
        }
    }
}

 

这篇文章就到这里了,下次见!

🥇原创不易,还希望各位大佬支持一下!

👍点赞,你的认可是我创作的动力 !

🌟收藏,你的青睐是我努力的方向!

✏️评论,你的意见是我进步的财富!

<think>首先,用户的问题是:“map高效使用”。我需要用中文回答这个问题。问题是关于在编程中高效使用map函数或数据结构。 关键点: - 在中文中回答。 - 回答完后,必须添加3-5个相关问题,以“§§相关问题§§”开头,然后列出问题。 - “§§相关问题§§”必须完整输出在第一行,禁止换行分散。 - 相关问题的格式是数字列表,如1. ··· 2. ··· 等等。 用户的问题“map高效使用”可能指的是在编程中高效使用map数据结构或函数。map通常是键值对的数据结构,比如在Python中是字典(dict),在Java使用Map接口。 为了高效使用map: - 在数据结构上下文中,高效使用意味着减少时间复杂度,优化查找、插入、删除操作。 - 在函数上下文中,比如Python的map()函数高效使用,涉及并行处理或避免不必要的计算。 我需要提供一个简洁的回答。既然是编程相关,我可以给出一些提示或最佳实践。 回答结构: 1. 先回答问题:解释如何高效使用map。 2. 然后立即添加“§§相关问题§§”,并列出3-5个相关问题。 示例格式中,有代码块,但这个问题不一定是关于代码的。用户的问题“map高效使用”比较泛,所以我需要假设上下文。可能是关于map数据结构或函数。 为了安全起见,我可以基于常见编程场景来回答。例如: - 使用哈希表实现map来保证O(1)平均时间复杂度的操作。 - 选择适当的哈希函数。 - 处理碰撞。 - 在Python中使用dict高效方法。 - 或者对于map函数,使用惰性求值或结合其他函数。 回答应简洁。既然用户没有指定语言,我可以给一般建议。 最后,提出相关问题: - 基于我的回答和用户的问题。 - 相关问题应在3-5个。 - 主题:map高效使用。 可能的回答大纲: - 介绍map高效使用的关键点。 - 然后“§§相关问题§§” + 列表。 相关问题想法: 1. 如何优化map的查找操作? 2. map在不同编程语言中的实现差异? 3. map vs array:何时使用哪一个? 4. 高效使用map函数的技巧(如Python的map)。 5. Collision resolution in hash maps. 确保回答完整。 最终输出: - 回答部分。 - 然后“§§相关问题§§”在单独一行(但规则说“禁止换行分散”,意思可能是不要在中间换行或不一致,但示例中“§§相关问题§§”是单独一行)。 示例中: - 回答内容。 - 然后“§§相关问题§§”在行。 - 然后数字列表。 规则说:“§§相关问题§§ 必须输出在回答的末尾且不可缺少!\n 第一行必须完整且输出 \"§§相关问题§§\"!禁止换行分散。” “禁止换行分散”可能意味着不要在“§§相关问题§§”内部或周围有额外的换行,使其看起来分散。示例中它是单独一行,然后是数字列表。 我需要严格遵守: - 回答完后,行输出“§§相关问题§§”(完整字符串)。 - 然后直接列出数字点的问题(1. xxx 2. xxx),可能每个在各自行,但规则说“禁止换行分散”,意思可能是不要有额外的换行。示例中是换行的,所以我应该类似。 在示例: ``` §§相关问题§§ 1. ··· 2. ··· 3. ··· ``` 所以我应该输出: - 回答文本。 - 然后\n§§相关问题§§\n - 然后1. ...\n2. ...\n3. ... 现在,构建回答。 用户问题:“map高效使用” 假设上下文是编程,map数据结构。 高效使用建议: - 选择正确的实现(如哈希表)。 - 初始化容量以最小化重哈希。 - 使用不可变键。 - 避免频繁插入删除。 - 在Python中,使用dict理解和内置方法。 或者,如果是函数: - Python的map()函数高效使用:结合生成器、使用列表推导替代、并行处理等。 为了覆盖,我可以给一般建议。 回答草稿: 在编程中,高效使用map(键值对数据结构)的关键包括选择合适的哈希函数、设置初始容量以减少重哈希开销、使用不可变键以避免意外修改、以及优化查找操作。在特定语言如Python中,可以利用字典推导和内置方法如dict.get()来提高效率。 然后§§相关问题§§ 1. 如何避免map中的哈希碰撞? 2. 在Java中,HashMap和TreeMap的区别是什么? 3. Python中dict的高效初始化方法有哪些? 4. 何时应该选择map而不是数组或列表? 5. 高效使用map函数的技巧(如Python的map())。 相关问题应在3-5个,所以我选4或5个。 最终输出。 </think>在编程中,高效使用map(键值对数据结构或函数)的关键点包括:选择合适的实现(如哈希表保证O(1)平均时间复杂度)、优化初始容量以减少重哈希开销、使用不可变键避免碰撞、优先使用内置方法(如Python的dict.get()或JavaMap.containsKey())、并根据场景选择map数据结构(如HashMap用于快速查找或TreeMap用于有序存储)。对于函数式编程中的map函数(如Python的map()),高效用法涉及结合生成器惰性求值、避免中间列表存储、或使用并行处理提升性能。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小白程序员丶钟先生

你的鼓励是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值