这是我想要设置数据的模型。
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());
答案 0 :(得分:1)
查看您正在使用的方法。对于listofName
它:
stream -> map -> collect
代表litsOfsumOfMarks
:
stream -> map -> flatMap -> map -> collect
方法map
将保留元素的数量,但flatMap
不必。这意味着列表listofName
和litsOfsumOfMarks
的大小可能不同。如果您确定使用的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());