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.
相关产品推荐
相关产品推荐

