You need to enable JavaScript to run this app. Java中如何使用Lambda表达式输出15岁以下人员的名?
优惠活动
大模型
产品
解决方案
定价
更多

Java中如何使用Lambda表达式输出15岁以下人员的名?

报错原因

你编写的代码无法正常运行,来自两处核心逻辑问题:

  • 属性访问逻辑偏差:personList是存储所有Person实例的集合容器,本身不包含单个人员的名字属性,根本不存在personList.FirstName这种可访问的内容。同时Java类的字段默认是封装为私有状态,不能直接通过点语法读取字段值,必须借助类对外提供的公共getter方法(也就是你代码中已经使用过的、类似getBirthDate()的取值方法)获取属性。
  • Stream API使用错误:FindCompulsorySchooling方法返回的是包含单个Person对象的流,forEach操作需要接收一个可以处理「单个流元素」的消费逻辑。你写的System.out::println(personList.FirstName)既不符合方法引用的语法规则,也没有把流中的每个Person对象和名字取值的逻辑绑定,自然无法拿到正确的输出内容。
正确实现方案

你现有的筛选逻辑已经完全符合要求,只需要在筛选后的流处理中补充名字提取的步骤即可,两种可直接运行的写法:

写法1:映射转换后输出

通过map操作把流中的Person对象直接转换为对应的姓名字符串,再逐行打印:

FindCompulsorySchooling(personList)
    // 将每个Person实例映射为它的名字属性值
    .map(Person::get对应名字的getter方法名)
    .forEach(System.out::println);

写法2:遍历过程中取值输出

不做流结构转换,直接在遍历每个元素的lambda逻辑中读取属性并打印:

FindCompulsorySchooling(personList)
    // 遍历每个符合条件的Person对象,读取名字并打印
    .forEach(person -> System.out.println(person.get对应名字的getter方法名()));

注意事项:需要提前确认自定义的Person类中,已经编写了对应名字的getter方法。结合你构造Person实例的参数顺序(Integer.parseInt(splitter[0]),splitter[1],splitter[2], 出生日期),可在类中找到对应「名」属性的getter方法(比如如果splitter[2]存的是名,对应的方法名可能是你自定义的命名),替换上面代码里的方法引用即可,否则会出现无法读取属性的编译错误。

内容的提问来源于stack exchange,提问作者Tom D.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.03 09:24:02