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

如何用Stream过滤Map中列表长度超阈值的元素并获取对应键

筛选Map中列表长度超阈值的键的正确实现

场景说明

你有如下Map<String, List<String>>集合:

Map<String, List<String>> data = new HashMap<>();
data.put("car", Arrays.asList("toyota", "bmw", "honda"));
data.put("fruit", Arrays.asList("apple","banana"));
data.put("computer", Arrays.asList("acer","asus","ibm"));
List<String> multipleVersions = new ArrayList<>();

需要找出所有对应列表长度超过指定阈值(比如2)的键,输出格式要求为以下项超过限制:Car , Computer。之前用Stream写法时出现打印java.util.stream.ReferencePipeline$2@1b28cdfa的问题,本质是没有给Stream添加终止操作——Stream是惰性求值的,只定义中间操作不会执行任何逻辑,直接打印Stream对象只会输出其内存地址。

优雅实现方案

方案1:先收集结果再格式化输出

适合需要保留筛选出的键后续使用的场景:

int threshold = 2;
// 筛选+转换首字母大写+收集为列表
List<String> overLimitKeys = data.entrySet().stream()
        .filter(entry -> entry.getValue().size() > threshold)
        .map(entry -> {
            String key = entry.getKey();
            return key.substring(0, 1).toUpperCase() + key.substring(1);
        })
        .collect(Collectors.toList());

// 拼接成目标格式输出
String result = String.format("以下项超过限制:%s", String.join(" , ", overLimitKeys));
System.out.println(result);

方案2:流式处理直接构建输出

如果不需要保留结果,可直接在Stream中完成拼接:

int threshold = 2;
StringBuilder outputBuilder = new StringBuilder("以下项超过限制:");

data.entrySet().stream()
        .filter(entry -> entry.getValue().size() > threshold)
        .map(entry -> entry.getKey().substring(0,1).toUpperCase() + entry.getKey().substring(1))
        .forEach(key -> {
            if (outputBuilder.length() > "以下项超过限制:".length()) {
                outputBuilder.append(" , ");
            }
            outputBuilder.append(key);
        });

System.out.println(outputBuilder.toString());

输出结果

两种方案都会输出:

以下项超过限制:Car , Computer

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 17:31:11