You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java 8 Stream:List转Map<String,Set<String>>时如何过滤指定值

解决方案:过滤type 3地址的学生地址Map实现

我来帮你搞定这个需求!核心就是在收集地址集合的环节,添加过滤逻辑排除类型为type 3的地址条目就行。下面结合代码示例一步步说明:

先明确类结构(假设你的实体类是这样的)

首先咱们先补全必要的实体类定义(方便你对应自己的代码):

// 学生类
class Student {
    private String name;
    private List<Address> addresses;

    // 构造器、getName()、getAddresses() 这些基础方法就不写啦,你肯定有
}

// 地址类(包含type和地址值)
class Address {
    private int type;
    private int value; // 对应你输出里的1、2、3这类地址标识

    // 构造器、getType()、getValue() 同样省略基础方法
}

修改后的核心实现代码

方式1:用Java 9+的Stream API(更简洁)

如果你的项目用的是Java 9及以上版本,直接在分组时通过flatMapping结合filter过滤:

// 假设students是你的Student实例集合
Map<String, Set<Integer>> studentAddressMap = students.stream()
    .collect(Collectors.groupingBy(
        Student::getName, // 按学生姓名分组
        Collectors.flatMapping(
            student -> student.getAddresses().stream()
                .filter(address -> address.getType() != 3), // 关键:跳过type 3的地址
            Collectors.mapping(Address::getValue, Collectors.toSet())
        )
    ));

方式2:兼容Java 8的写法

如果还在用Java 8,没有flatMapping的话,换一种遍历处理的方式也很清晰:

Map<String, Set<Integer>> studentAddressMap = new HashMap<>();
for (Student student : students) {
    // 先过滤当前学生的地址,排除type3的,再转成Set
    Set<Integer> filteredAddresses = student.getAddresses().stream()
        .filter(address -> address.getType() != 3)
        .map(Address::getValue)
        .collect(Collectors.toSet());
    studentAddressMap.put(student.getName(), filteredAddresses);
}

逻辑说明

不管用哪种方式,核心都是这行过滤代码:

.filter(address -> address.getType() != 3)

它会把所有type等于3的地址条目直接排除,不会进入后续的地址值收集环节,这样最终生成的Map里,每个学生的地址集合就不会包含type3对应的条目啦。

比如如果某个学生原本有地址type=3, value=4,过滤后这个4就不会出现在他的Set里,完全符合你的要求。

内容的提问来源于stack exchange,提问作者prime

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 04:19:11