Java Map 通过 key 或者 value 过滤

本文介绍如何使用Java原生方法、Java 8 Lambda表达式及Google Guava库来按键值过滤Map集合。提供了详细的示例代码,展示了不同方法的实现方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天写根过滤的时候一下子有点愣眼,先是想到用 Java 原生的 map 循环查出来,但是觉得太 low, 后面思考了一下可以用 Java8 的 Lambda,写完了,又发现 Google Guava 有现成的方法,这里一一列出来,供参考使用。

首先提示,如果照搬我的代码的话别忘了引这些依赖

<dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.hamcrest</groupId>
                    <artifactId>hamcrest-core</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

        <dependency>
            <groupId>org.hamcrest</groupId>
            <artifactId>hamcrest-library</artifactId>
            <version>1.3</version>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
            <version>25.1-jre</version>
        </dependency>
</dependencies>
filter by key
public class FilterMapByKeyTest {
    private Map<Integer, String> WEEK = new HashMap<>();

    @Before
    public void setUp () {
        WEEK.put(1, "Monday");
        WEEK.put(2, "Tuesday");
        WEEK.put(3, "Wednesday");
        WEEK.put(4, "Thursday");
        WEEK.put(5, "Friday");
        WEEK.put(6, "Saturday");
        WEEK.put(7, "Sunday");
    }

    /**
     * Java 8之前的版本
     */
    @Test
    public void filterMapByKey () {
        Map<Integer, String> map = new HashMap<>();
        for (Map.Entry<Integer, String> entry : WEEK.entrySet()) {
            if (entry.getKey() <= 3) {
                map.put(entry.getKey(), entry.getValue());
            }
        }
        assertThat(map.keySet(), contains(1, 2, 3));
    }

    /**
     * Java 8 Lambda
     */
    @Test
    public void filterMapByKeyJava8Lambda () {
        Map<Integer, String> map = WEEK.entrySet().stream().filter(r -> r.getKey() <= 3)
                        .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
        assertThat(map.keySet(), contains(1, 2, 3));
    }

    /**
     * Google Guava
     */
    @Test
    public void filterMapByKeyGuava () {
        Map<Integer, String> map = Maps.filterKeys(WEEK, r -> r <= 3);
        assertThat(map.keySet(), contains(1, 2, 3));
    }

}
filter by value
public class FilterMapByValueTest {
    private Map<Integer, String> WEEK = new HashMap<>();

    @Before
    public void setUp () {
        WEEK.put(1, "Monday");
        WEEK.put(2, "Tuesday");
        WEEK.put(3, "Wednesday");
        WEEK.put(4, "Thursday");
        WEEK.put(5, "Friday");
        WEEK.put(6, "Saturday");
        WEEK.put(7, "Sunday");
    }

    /**
     * Java 8之前的版本
     */
    @Test
    public void filterMapByValue () {
        Map<Integer, String> map = new HashMap<>();
        for (Map.Entry<Integer, String> entry : WEEK.entrySet()) {
            if (entry.getValue().startsWith("S")) {
                map.put(entry.getKey(), entry.getValue());
            }
        }
        assertThat(map.values(), contains("Saturday","Sunday"));
    }

    /**
     * Java 8 Lambda
     */
    @Test
    public void filterMapByValueJava8Lambda () {
        Map<Integer, String> map = WEEK.entrySet().stream().filter(r -> r.getValue().startsWith("S"))
                .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
        assertThat(map.values(), contains("Saturday","Sunday"));
    }

    /**
     * Google Guava
     */
    @Test
    public void filterMapByValueGuava () {
        Map<Integer, String> map = Maps.filterValues(WEEK, r -> r.startsWith("S"));
        assertThat(map.values(), contains("Saturday","Sunday"));
    }
}

如果觉得内容还不错,可以关注一下我哦 

### Java过滤MapValue 为空的数据 在 Java 中,可以通过多种方式实现过滤掉 `Map` 中值为 `null` 或其他空状态(如空字符串)的键值对。其中一种常见的方式是使用 Java 8 引入的流式处理功能 (`Stream`) 结合 `Collectors.toMap()` 方法来创建一个新的过滤后的 `Map`。 以下是具体代码示例: ```java import java.util.*; import java.util.stream.Collectors; public class Main { public static void main(String[] args) { // 初始化原始 Map 数据 Map<String, String> originalMap = new HashMap<>(); originalMap.put("A", "Apple"); originalMap.put("B", ""); originalMap.put("C", "Cat"); originalMap.put("D", null); originalMap.put("E", "Elephant"); // 使用 Stream 过滤value 为空或 null 的项 Map<String, String> filteredMap = originalMap.entrySet() .stream() .filter(entry -> entry.getValue() != null && !entry.getValue().isEmpty()) .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); System.out.println(filteredMap); // 输出结果 {A=Apple, C=Cat, E=Elephant} } } ``` 在此代码中,我们先调用了 `entrySet().stream()` 将 `Map` 转化成一个流对象以便后续操作;之后应用了 `.filter()` 方法设定条件排除那些值等于 `null` 或长度为零 (即空字符串 `"`) 的条目[^1]。最后通过 `Collectors.toMap()` 收集器把符合条件的结果重组回新的 `Map` 形态。 另外,在不适用 Java 8 流的情况下也可以采用传统的迭代方式进行同样的逻辑处理: ```java import java.util.*; public class Main { public static void main(String[] args) { // 创建初始 Map 并填充数据 Map<String, String> originalMap = new HashMap<>(); originalMap.put("A", "Apple"); originalMap.put("B", ""); originalMap.put("C", "Cat"); originalMap.put("D", null); originalMap.put("E", "Elephant"); // 新建用于存储有效记录的目标 Map Map<String, String> filteredMap = new HashMap<>(); // 遍历原 Map ,挑选出非空值加入新 Map for (Map.Entry<String, String> entry : originalMap.entrySet()) { if (entry.getValue() != null && !entry.getValue().isEmpty()) { filteredMap.put(entry.getKey(), entry.getValue()); } } System.out.println(filteredMap); // 打印输出 {A=Apple, C=Cat, E=Elephant} } } ``` 这种方法虽然较为传统,但在某些受限环境中可能更为实用[^2]。 ####
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值