如果一个对象有两个或更多不同的列表,如何在流java 8中进行迭代?

时间:2018-03-27 13:05:31

标签: lambda java-8 java-stream

这是我想要设置数据的模型。

public class StudentMarksModel {
    private String studentName;
    private Integer totalmarks;


    public StudentMarksModel(String studentName, Integer totalmarks) {
        super();
        this.studentName = studentName;
        this.totalmarks = totalmarks;
    }
// getter setter .....  

}

这是我的实体

@Document(collection = "studentmarks")
    public class StudentMaksEntity {
        @Id
        private String id;
        @Field("studentid")
        private String studentid;

        @Field("studentname")
        private String studentname;

        @Field("subjectMarks")
        private List<SubjectMarks> subjectMarks;

       // getter setter

    }

列出实体内的对象

public class SubjectMarks {

@CreatedDate
@Field("created_date")
private Instant createdDate = Instant.now();
private String subject;
private Map<Integer,Integer> allmarks;
@Field("paperid")
private String paperId;

@Field("stnadard")
private Integer stnadard;
// getter setter
    }

这就是我在代码中的表现

    List<StudentMaksEntity> list=studentMaksEntityRepository.findBySubjectMarksPaperId(paperId);

首先我在名单中得到名字

List<String> listofName= list.stream()
                                     .map(m->m.getStudentname())
                                     .collect(Collectors.toList());

然后我在标记上流式传输并获得了主题标记的总和

List<Integer> litsOfsumOfMarks=list.stream()
                                    .map(mp->mp.getSubjectMarks())
                    .flatMap(List::stream)
                    .map(mp->mp.getAllmarks().values().stream()
                                              .mapToInt(q->q.intValue()).sum())
                    .collect(Collectors.toList());

List<StudentMarksModel> studentMarksModel = Stream.iterate(0, s -> s + 1)
                .map(p -> new StudentMarksModel(listofName.get(p), litsOfsumOfMarks.get(p)))
                .limit(litsOfsumOfMarks.size()).collect(Collectors.toList());

这是我的代码输出

[ {
  "studentName" : "S1",
  "totalmarks" : 5
}, {
  "studentName" : "S2",
  "totalmarks" : 5
}, {
  "studentName" : "S3",
  "totalmarks" : 5
}, {
  "studentName" : "S4",
  "totalmarks" : 5
} ]

在上面的代码中我必须使用两个不同的流但我想在一个流中执行它。

例如

list.stream().map(s -> s.getSubjectMarks())
                  .flatMap(List::stream)
                .map(p -> new StudentMarksModel("here i want name of student",p.getAllmarks().entrySet().stream().mapToInt(l -> l.getValue().intValue()).sum()))
                .collect(Collectors.toList());

2 个答案:

答案 0 :(得分:1)

查看您正在使用的方法。对于listofName它:

stream -> map -> collect

代表litsOfsumOfMarks

stream -> map -> flatMap -> map -> collect

方法map将保留元素的数量,但flatMap不必。这意味着列表listofNamelitsOfsumOfMarks的大小可能不同。如果您确定使用的flatMap将始终返回大小为1的流,则可以使用map轻松替换它。

当您确定两个流都包含相同数量的元素时,您可以合并它们,例如使用辅助类Pair,以便您可以

list.stream()
    .map(el -> new Pair(<A>, <B>))
    // additional operations on either A, B or A & B
    .map(p -> new StudentMarksModel(p.getA(), p.getB()))

答案 1 :(得分:0)

我希望你能找到这个:

List<StudentMarksModel> studentMarksModels = list.stream()
                   .map(mp -> {
                        int sum = mp.getSubjectMarks()
                                    .stream()
                                    .flatMap((SubjectMarks t) -> 
                                             t.getAllmarks().values().stream())
                                    .mapToInt(q -> q.intValue()).sum();
                        return new StudentMarksModel(mp.getStudentname(), sum);
        }).collect(Collectors.toList());