Java 常用lambda操作集合

数据初始化

 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}]}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值