如何使用 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()))
                 )
    );

我不知道如何使第二个流返回每个学生的firstNamelastName 字符串。我可以将它映射到字符串然后以某种方式收集它吗? 第一个流里面有这样的东西吗?

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 循环中)?

如何使用 Java 8 Lambda 将对象列表转换为 Map<Object, Object>

如何在返回集合的 lambda 中使用异步

java 中如何打印一个List集合的索引