如何使用 lambda 在对象中打印集合列表
Posted
技术标签:
【中文标题】如何使用 lambda 在对象中打印集合列表【英文标题】:How to print set list in object with lambda 【发布时间】:2018-12-04 10:15:39 【问题描述】:我有这样的课:
public class Subject extends Entitet
private String personalID;
private String name;
private Integer ECTS;
private Profesor subjectBearer;
private Set<Student> students;
//all getters and seters
在主目录中,我创建了一个包含所有主题的列表。
List<Subjet> subjets= new ArrayList<>();
现在我想打印所有学生的所有科目名称 上课。
我尝试过这样的事情,但它给了我错误:
操作符 + 未定义参数类型 String, void
subjets.stream()
.forEach(subj-> System.out.println(subj.getSubjectBearer().getName()+ " " + subj.getSubjectBearer().getLastName()+" "+
subj.getStudents().stream()
.forEach(stud->System.out.println(stud.getName()+" "+stud.getLastName()))
)
);
我不知道如何使第二个流返回每个学生的firstName
和lastName
字符串。我可以将它映射到字符串然后以某种方式收集它吗?
第一个流里面有这样的东西吗?
subj.getStudents().stream()
.map(stud->(stud.getFirstName()+ stud.getLastName() )
.collect(Collectors.toString())
【问题讨论】:
【参考方案1】:这是因为forEach
不会产生任何结果(返回无效)。因此,当您希望将某些内容连接到主题名称时,您对学生的第二个 forEach
将不会返回任何内容。
您可以:
返回所有学生的字符串
subjets.stream()
.forEach(subj-> System.out.println(
subj.getSubjectBearer().getName()+ " " +
subj.getSubjectBearer().getLastName()+" "+
subj.getStudents().stream()
.map(stud->stud.getName()+" "+stud.getLastName())
.collect(Collectors.joining(","))
));
或打印不连接的名称:
subjets.stream()
.forEach(subj->
System.out.println(subj.getSubjectBearer().getName()+ " " + subj.getSubjectBearer().getLastName());
subj.getStudents().stream()
.forEach(stud->System.out.println(stud.getName()+" "+stud.getLastName()))
);
【讨论】:
【参考方案2】:由于您使用的是 + 运算符错误:-
subj.getSubjectBearer().getLastName()+" "+ subj.getStudents().stream().forEach(stud->System.out.println(stud.getName()+" "+stud.getLastName())) )
+ 运算符正在处理 String 和 void,因为第二部分是创建学生流,然后处理它并没有返回任何 String。
【讨论】:
【参考方案3】:forEach 方法 id 是 void 类型。把你的陈述分成两个陈述。
subjets.stream()
.forEach(subj-> System.out.println(subj.getSubjectBearer().getName()+ " " + subj.getSubjectBearer().getLastName());
subj.getStudents().stream()
.forEach(stud->System.out.println(stud.getName()+" "+stud.getLastName()))
)
);
【讨论】:
【参考方案4】:在您的问题中,您的属性/方法中有一些拼写错误的名称,但我想它不在您的源代码中。
我认为你应该只使用 System.out 一次,因此首先创建字符串表示,这样:
System.out.println(subjets.stream()
.map(subj-> (subj.getName()+ " " + subj.getLastName() + " \n\t" +
subj.getStudents().stream().map(
stud->stud.getFirstName() + " " + stud.getLastName()).collect(Collectors.joining(","))
)
).reduce("", String::concat)
);
您可以根据需要调整分隔符。
如果您需要进一步的解释,请告诉我。
【讨论】:
你试过这个解决方案了吗?【参考方案5】:你很接近,试试这样的:
subjets.stream()
.forEach(subj-> System.out.println(subj.getSubjectBearer().getName() + " "
+ subj.getSubjectBearer().getLastName() + " " + subj.getStudents()
.stream()
.map(stud -> stud.getName() + " " + stud.getLastName())
.collect(Collectors.joining(",")));
【讨论】:
能否请好心人帮我格式化一下代码。我来自电话,我无法做到。 :)【参考方案6】:subjets.stream() .forEach(主题-> System.out.println(subj.getSubjectBearer().getName()+ " " + subj.getSubjectBearer().getLastName()); subj.getStudents().stream() .forEach(stud->System.out.println(stud.getName()+" "+stud).getLastName());
);
我已更正您的代码。请尝试,它应该可以工作
错误的原因是在 System.out.println 内部,您正在调用不可能发生的流。SOP 接受需要分离的字符串对象。 第二件事对于每个接受消费者的多个语句添加花括号,并且对于每个语句,请以结束语句;
【讨论】:
【参考方案7】:可能会有所帮助:
listEntries.stream()
.map(obj -> obj.getName()).collect(Collectors.toList()));
【讨论】:
以上是关于如何使用 lambda 在对象中打印集合列表的主要内容,如果未能解决你的问题,请参考以下文章
如何创建 lambda 列表(在列表理解/for 循环中)?
如何在java 8中将字符串排序为带有lambdas的int
如何创建 lambda 列表(在列表理解/for 循环中)?