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

如何用Java Stream筛选符合条件且长度最长的元素?

优雅实现筛选+取最长长度元素的Stream方案

嘿,你的需求完全可以用Java Stream API简洁搞定!我给你推荐两种实用的写法,既能满足所有要求,又保持代码的可读性:

方案一:按长度分组后取最大组

这是最直观的一步到位写法:

List<String> list = new ArrayList<>();
list.add("xone");
list.add("two");
list.add("xthree");
list.add("xseven");

List<String> longestElements = list.stream()
    // 1. 筛选以"x"开头的元素
    .filter(e -> e.startsWith("x"))
    // 2. 按字符串长度分组,键为长度,值为对应长度的所有元素
    .collect(Collectors.groupingBy(String::length))
    // 找出长度最大的分组
    .entrySet()
    .stream()
    .max(Map.Entry.comparingByKey())
    // 取出该分组的所有元素,无符合条件元素时返回空列表
    .map(Map.Entry::getValue)
    .orElse(Collections.emptyList());

// 输出结果:[xthree, xseven]
System.out.println(longestElements);

方案二:分两步计算(适合复用中间结果的场景)

如果需要单独拿到筛选后的列表或最长长度,可以拆成更灵活的两步:

// 先筛选出符合条件的元素
List<String> filteredList = list.stream()
    .filter(e -> e.startsWith("x"))
    .collect(Collectors.toList());

// 计算最长长度
int maxLength = filteredList.stream()
    .mapToInt(String::length)
    .max()
    .orElse(0);

// 筛选出长度等于最长长度的元素
List<String> longestElements = filteredList.stream()
    .filter(e -> e.length() == maxLength)
    .collect(Collectors.toList());

为什么不推荐用sorted后处理?

你原来的代码用到了sorted,但如果要拿到所有最长元素,还得先遍历到排序后的末尾记录最长长度,再重新收集,多了一次冗余遍历。上面两种方案要么逻辑更清晰,要么效率更优,比排序后处理更合适。

注意:如果你的Java版本是16及以上,可以用toList()替代collect(Collectors.toList()),代码会更简洁~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 07:08:13