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

Java Stream排序后获取名称时println方法报错如何修复

报错根因

你的代码存在两个核心问题,既触发了编译报错,也没有实现「排序后仅提取用户名称输出」的需求:

  1. forEach 方法参数语法错误:forEach 要求传入符合Consumer<T>签名的函数式接口实例,你写的System.out.println(User::getFirstName)是错误的方法引用写法——这种写法本质是尝试调用println方法、把User::getFirstName作为入参传入,但PrintStream类的所有println重载版本都不接收函数式类型参数,自然会报找不到对应方法的错误。
  2. 缺少名称提取步骤:排序后的流元素还是完整的User对象,你没有做字段映射,就算修正了forEach的语法,输出的也是整个User对象的字符串表示,不是你需要的用户名称。

另外代码还有一处冗余:排序后调用.collect(Collectors.toList())完全没有必要,流排序后可以直接执行后续映射、遍历操作,额外的收集步骤只会凭空增加内存占用。

修正方案

把流操作调整为「排序 -> 映射提取名称 -> 遍历输出」即可,修正后的test方法如下:

public void test() {
    userList.stream()
            .sorted(Comparator.comparingInt(User::getAge)
                    .thenComparing(User::getFirstName))
            // 提取用户名称,将流从Stream<User>转换为存用户名的Stream<String>
            .map(User::getFirstName)
            // 传入正确的Consumer方法引用,遍历输出每个用户名
            .forEach(System.out::println);
}

运行后输出顺序完全符合预期:

  • 年龄7岁:John
  • 年龄11岁(同年龄按名字字典序排序):Mary、Sue
  • 年龄23岁:William
  • 年龄37岁(同年龄按名字字典序排序):Michael、Robert
  • 年龄77岁:Jennifer

如果你需要先持有排序后的用户名列表做其他业务处理,也可以保留collect步骤,写法如下:

public void test() {
    List<String> sortedNames = userList.stream()
            .sorted(Comparator.comparingInt(User::getAge)
                    .thenComparing(User::getFirstName))
            .map(User::getFirstName)
            .collect(Collectors.toList());
    // 后续可对sortedNames做其他业务操作
    sortedNames.forEach(System.out::println);
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 19:39:39