如何用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
相关产品推荐
相关产品推荐

