如何使用Lambda在对象中打印设置列表

时间:2018-12-04 10:15:40

标签: java lambda java-8

我有一个这样的班级:

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<>();

现在我想将所有学科的名称打印给所有 上课。

我尝试了类似的方法,但是它给了我错误:

  

未定义参数类型的运算符+字符串,无效

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())

7 个答案:

答案 0 :(得分:3)

这是因为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()))
    });

答案 1 :(得分:0)

由于您正在使用+,所以发生+运算符错误:-

subj.getSubjectBearer()。getLastName()+“ ” +             subj.getStudents()。stream()。forEach(stud-> System.out.println(stud.getName()+“” + stud.getLastName()))                  )

+运算符正在处理String和void,因为创建学生流然后对其进行处理的第二部分不会返回任何String。

答案 2 :(得分:0)

forEach方法ID是void类型。将您的陈述分为两个陈述。

file

答案 3 :(得分:0)

您很近,尝试这样的事情:

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(",")));

答案 4 :(得分:0)

在您的问题中,您的属性/方法中有一些拼写错误的名称,但我想它不在您的源代码中。

我认为您应该只使用System.out一次,并因此首先以这种方式创建String演示文稿:

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 :(得分:0)

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());

    });

我已更正您的代码。请尝试,它应该可以工作

错误原因是在System.out.println内部,您正在调用无法发生的流。SOP接受需要分开的字符串对象。 第二件事是每个接受消费者的多个语句添加大括号,对于每个语句,请在结尾加上;

答案 6 :(得分:0)

可能有帮助:

listEntries.stream()
                .map(obj -> obj.getName()).collect(Collectors.toList()));