数据初始化
List<TaskDetailVo> taskDetailVoList = new ArrayList<>();
TaskDetailVo taskDetailVo1 = new TaskDetailVo();
TaskDetailVo taskDetailVo2 = new TaskDetailVo();
TaskDetailVo taskDetailVo3 = new TaskDetailVo();
taskDetailVo1.setTotalScore(11L);
taskDetailVo2.setTotalScore(13L);
taskDetailVo3.setTotalScore(3L);
taskDetailVo1.setCompanyId(99L);
taskDetailVo2.setCompanyId(991L);
taskDetailVo3.setCompanyId(91L);
taskDetailVoList.add(taskDetailVo1);
taskDetailVoList.add(taskDetailVo3);
taskDetailVoList.add(taskDetailVo2);
1、forEach
//排序,
System.out.print("初始顺序:");
taskDetailVoList.stream().parallel().forEach(
taskDetailVo -> {
System.out.print(taskDetailVo.getTotalScore());
System.out.print(" ");
}
);
System.out.println();
//排序,按照顺序,即使在并发情况下
System.out.print("初始顺序,即使在并发情况下:");
taskDetailVoList.stream().parallel().forEachOrdered(
taskDetailVo -> {
System.out.print(taskDetailVo.getTotalScore());
System.out.print(" ");
}
);
System.out.println();
结果
初始顺序:3 13 11
初始顺序,即使在并发情况下:11 3 13
改变List之中的对象值
//list数据操作
System.out.print("设值后:");
taskDetailVoList.stream()
.map(taskDetailVo -> {
taskDetailVo.setTotalScore(1L);
return taskDetailVo;
})
.forEach(
taskDetailVo -> {
System.out.print(taskDetailVo.getTotalScore());
System.out.print(" ");
}
);
System.out.println();
设值后:1 1 1
排序,不会对原来的taskDetailVoList改变,需要新的集合收集排序后的数据
taskDetailVoList.stream().sorted(Comparator.comparing(TaskDetailVo::getCompanyId)).forEach(
taskDetailVo -> {
System.out.print(taskDetailVo.getCompanyId());
System.out.print(" ");
}
);
91 99 991
list->map 对List分组聚合,计算每个分组的数量
public static void main(String[] args) {
List<AnswerResultOpenDto> tempList = new ArrayList<>();
AnswerResultOpenDto answerResultOpenDto0 = new AnswerResultOpenDto();
answerResultOpenDto0.setQuestionId(1L);
AnswerResultOpenDto answerResultOpenDto2 = new AnswerResultOpenDto();
answerResultOpenDto2.setQuestionId(1L);
AnswerResultOpenDto answerResultOpenDto1 = new AnswerResultOpenDto();
answerResultOpenDto1.setQuestionId(1L);
tempList.add(answerResultOpenDto0);
tempList.add(answerResultOpenDto1);
tempList.add(answerResultOpenDto2);
AnswerResultOpenDto answerResultOpenDto3 = new AnswerResultOpenDto();
answerResultOpenDto3.setQuestionId(2L);
tempList.add(answerResultOpenDto3);
AnswerResultOpenDto answerResultOpenDto4 = new AnswerResultOpenDto();
answerResultOpenDto4.setQuestionId(3L);
AnswerResultOpenDto answerResultOpenDto5 = new AnswerResultOpenDto();
answerResultOpenDto5.setQuestionId(3L);
tempList.add(answerResultOpenDto4);
tempList.add(answerResultOpenDto5);
Map<Long,Long> result = tempList.stream().collect(Collectors.groupingBy(AnswerResultOpenDto::getQuestionId,Collectors.counting()));
System.out.println(result);
}
{1=3, 2=1, 3=2}
对List分组求和
public static void main(String[] args) {
List<AnswerResultOpenDto> tempList = new ArrayList<>();
AnswerResultOpenDto answerResultOpenDto0 = new AnswerResultOpenDto();
answerResultOpenDto0.setQuestionId(1L);
answerResultOpenDto0.setModuleId(1L);
AnswerResultOpenDto answerResultOpenDto2 = new AnswerResultOpenDto();
answerResultOpenDto2.setQuestionId(1L);
answerResultOpenDto2.setModuleId(2L);
AnswerResultOpenDto answerResultOpenDto1 = new AnswerResultOpenDto();
answerResultOpenDto1.setQuestionId(1L);
answerResultOpenDto1.setModuleId(5L);
tempList.add(answerResultOpenDto0);
tempList.add(answerResultOpenDto1);
tempList.add(answerResultOpenDto2);
AnswerResultOpenDto answerResultOpenDto3 = new AnswerResultOpenDto();
answerResultOpenDto3.setQuestionId(2L);
answerResultOpenDto3.setModuleId(4L);
tempList.add(answerResultOpenDto3);
AnswerResultOpenDto answerResultOpenDto4 = new AnswerResultOpenDto();
answerResultOpenDto4.setQuestionId(3L);
AnswerResultOpenDto answerResultOpenDto5 = new AnswerResultOpenDto();
answerResultOpenDto5.setQuestionId(3L);
answerResultOpenDto5.setModuleId(2L);
tempList.add(answerResultOpenDto4);
tempList.add(answerResultOpenDto5);
Map<Long,Long> result = tempList.stream().collect(Collectors.groupingBy(AnswerResultOpenDto::getQuestionId,
Collectors.summingLong(answerResultOpenDto ->answerResultOpenDto.getModuleId()==null?0L:answerResultOpenDto.getModuleId()
)
));
System.out.println(result);
}
{1=8, 2=4, 3=2}
分组求和第二种方式,和上面等价
Map<Long,Long> result = tempList.stream().collect(Collectors.groupingBy(AnswerResultOpenDto::getQuestionId,
Collectors.mapping(answerResultOpenDto ->answerResultOpenDto.getModuleId()==null?0L:answerResultOpenDto.getModuleId(),
Collectors.summingLong(a->a)
)
));
第三种分组统计或求和都可以
Map<Long,Long> result1 = tempList.stream()
.collect(Collectors.toMap(AnswerResultOpenDto::getQuestionId,l->1L,(old,newVal)->old+newVal));
Map<Long,Long> result1 = tempList.stream()
.collect(Collectors.toMap(AnswerResultOpenDto::getQuestionId,l->l.getModuleId(),(old,newVal)->old+newVal));
分组排序:先排序,再分组即可
Map<Long,List<AnswerResultOpenDto>> result = tempList.stream().sorted(
Comparator.comparing(AnswerResultOpenDto::getModuleId).reversed()
).collect(Collectors.groupingBy(AnswerResultOpenDto::getQuestionId));
{1:[{"moduleId":5,"questionId":1},{"moduleId":2,"questionId":1},{"moduleId":1,"questionId":1}],2:[{"moduleId":4,"questionId":2}],3:[{"moduleId":2,"questionId":3},{"moduleId":1,"questionId":3}]}