杰瑞科技汇

java map 获取value

get(K key)

这是最直接、最常用的方法,用于根据键来获取对应的值。

基本用法

get() 方法的签名是 V get(Object key),它会返回与指定键关联的值。

  • 如果找到键:返回对应的值。
  • 如果未找到键:返回 null

示例代码:

import java.util.HashMap;
import java.util.Map;
public class GetValueExample {
    public static void main(String[] args) {
        // 1. 创建一个 Map 并存入数据
        Map<String, Integer> studentScores = new HashMap<>();
        studentScores.put("Alice", 95);
        studentScores.put("Bob", 88);
        studentScores.put("Charlie", 92);
        // 2. 使用 get() 方法获取 value
        Integer alicesScore = studentScores.get("Alice");
        System.out.println("Alice's score: " + alicesScore); // 输出: Alice's score: 95
        Integer bobsScore = studentScores.get("Bob");
        System.out.println("Bob's score: " + bobsScore);     // 输出: Bob's score: 88
        // 3. 获取一个不存在的 key
        Integer davesScore = studentScores.get("Dave");
        System.out.println("Dave's score: " + davesScore);   // 输出: Dave's score: null
    }
}

重要注意事项:处理 null

get() 方法在找不到键时会返回 null,如果你的 Map 中允许 valuenull,那么你就无法通过返回值 null 来区分是“键不存在”还是“键存在但其值为 null”。

示例:null 值的歧义

Map<String, String> settings = new HashMap<>();
settings.put("timeout", "30");
settings.put("debugMode", null); // 允许 value 为 null
String timeout = settings.get("timeout");      // 返回 "30"
String debugMode = settings.get("debugMode");  // 返回 null
String nonExistent = settings.get("nonExistent"); // 返回 null
// debugMode 和 nonExistent 都是 null,但含义不同

解决方案

为了解决这个问题,Java 提供了一个更安全的方法。

安全获取:getOrDefault(K key, V defaultValue)

这个方法在 Java 8 中引入,非常实用,它会返回与指定键关联的值,如果找不到该键,则返回指定的默认值

语法: V getOrDefault(Object key, V defaultValue)

示例代码:

import java.util.HashMap;
import java.util.Map;
public class GetOrDefaultExample {
    public static void main(String[] args) {
        Map<String, String> settings = new HashMap<>();
        settings.put("timeout", "30");
        settings.put("debugMode", null);
        // 使用 getOrDefault
        String timeout = settings.getOrDefault("timeout", "60"); // key 存在,返回 "30"
        System.out.println("Timeout: " + timeout); // 输出: Timeout: 30
        String debugMode = settings.getOrDefault("debugMode", "false"); // key 存在,值为 null,返回 null
        System.out.println("Debug Mode: " + debugMode); // 输出: Debug Mode: null
        String nonExistent = settings.getOrDefault("nonExistent", "default_value"); // key 不存在,返回默认值
        System.out.println("Non-existent setting: " + nonExistent); // 输出: Non-existent setting: default_value
    }
}

优点:

  • 彻底消除了 null 值的歧义。
  • 代码更简洁,避免了繁琐的 if-else 判断。

高级用法:获取所有 value

如果你需要获取 Map 中所有的值,而不是单个值,可以使用以下方法。

获取所有值的集合:values()

values() 方法返回一个 Collection<V>,包含了 Map 中的所有值,这个集合是 Map 视图,意味着对 Map 的修改会直接反映在这个集合中。

示例代码:

import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
public class GetAllValuesExample {
    public static void main(String[] args) {
        Map<Integer, String> errorCodes = new HashMap<>();
        errorCodes.put(404, "Not Found");
        errorCodes.put(500, "Internal Server Error");
        errorCodes.put(200, "OK");
        // 获取所有 value 的集合
        Collection<String> allMessages = errorCodes.values();
        System.out.println("All error messages: " + allMessages);
        // 输出可能为: All error messages: [Not Found, Internal Server Error, OK]
        // (注意:HashMap 的迭代顺序不保证)
        // 遍历所有 value
        System.out.println("\nIterating through all values:");
        for (String message : allMessages) {
            System.out.println(message);
        }
    }
}

结合 Lambda 表达式 (Java 8+)

Java 8 引入的 Stream API 让处理 Map 变得非常强大。

查找并转换:stream().map()

如果你想获取所有 value 并进行一些处理(转换类型或筛选),可以使用 stream()

示例:获取所有分数并求和

import java.util.HashMap;
import java.util.Map;
public class MapStreamExample {
    public static void main(String[] args) {
        Map<String, Integer> studentScores = new HashMap<>();
        studentScores.put("Alice", 95);
        studentScores.put("Bob", 88);
        studentScores.put("Charlie", 92);
        studentScores.put("David", 75);
        // 使用 Stream 获取所有 value 并求和
        int totalScore = studentScores.values()
                                      .stream() // 创建一个 value 的流
                                      .mapToInt(Integer::intValue) // 转换为 IntStream
                                      .sum(); // 求和
        System.out.println("Total score of all students: " + totalScore); // 输出: Total score of all students: 350
        // 使用 Stream 筛选出及格的分数
        System.out.println("\nPassing scores:");
        studentScores.values()
                     .stream()
                     .filter(score -> score >= 60) // 筛选条件
                     .forEach(System.out::println); // 打印
    }
}

场景 推荐方法 说明
获取单个确定的值 map.get(key) 最简单直接的方法。
获取单个值,并处理键不存在的情况 map.getOrDefault(key, defaultValue) 强烈推荐,避免 NullPointerException,代码更健壮。
检查键是否存在,然后获取值 if (map.containsKey(key)) { ... } 在需要执行复杂逻辑时使用,比 get + null 判断更清晰。
获取 Map 中所有的值 Collection<V> values = map.values(); 获取一个包含所有值的动态视图集合。
需要对所有值进行计算或转换 map.values().stream().(...) Java 8+ 的现代方式,功能强大,易于并行处理。

选择建议:

  • 日常开发:优先使用 getOrDefault(),它能让你写出更安全、更简洁的代码。
  • 性能要求极高:在确定键一定存在的情况下,get() 的性能略好于 getOrDefault(),因为少了一次比较,但在大多数应用中,这个性能差异可以忽略不计。
  • 需要批量处理:使用 values()stream()
分享:
扫描分享到社交APP
上一篇
下一篇