【问题标题】:How to print set list in object with lambda如何使用 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())

【问题讨论】:

    标签: java lambda java-8


    【解决方案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()));
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2021-12-31
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多