Map<Long, User> maps = userList.stream().collect(Collectors.toMap(User::getId, Function.identity(), (key1, key2) -> key2));
时间: 2024-05-30 14:13:48 浏览: 146
好的,我明白了。对于你的问题,这是一个 Java 8 中使用 Stream API 和 Collectors 类的例子。它将一个用户列表 userList 转换成一个 Map<Long, User> 类型的 map,其中每个 User 对象的 id 字段被用作键。值是用户对象本身。如果有重复的键,使用 lambda 函数 (key1, key2) -> key2 将后一个键的值覆盖前一个键的值。
相关问题
解读这段代码:Map<Long, String> maps = userList.stream().collect(Collectors.toMap(User::getId, User::getAge, (key1, key2) -> key2));
这段代码使用 Java 8 的 Stream API 对 `userList` 中的每个 `User` 对象进行操作,将其转换为一个 `Map<Long, String>` 对象。其中:
- `User::getId` 和 `User::getAge` 是方法引用,分别表示获取 `User` 对象的 `id` 和 `age` 属性;
- `Collectors.toMap` 是一个静态方法,用于将 Stream 中的元素转换为一个 Map 对象。它接受三个参数:
- 第一个参数表示 Map 中的键的生成方式,这里使用 `User::getId`;
- 第二个参数表示 Map 中的值的生成方式,这里使用 `User::getAge`;
- 第三个参数表示当键重复时的处理方式。这里使用 `(key1, key2) -> key2`,表示取第二个键对应的值覆盖第一个键对应的值。
因此,这段代码的作用是将 `userList` 中的每个 `User` 对象转换为一个以 `id` 为键、`age` 为值的 `Map` 对象,并且当 `id` 重复时,用后面的 `User` 对象的 `age` 覆盖前面的。
帮我解读一下这段代码:if (CollectionUtils.isEmpty(labelIds) || userId == null) { return new ArrayList<>(); } LambdaQueryWrapper<LabelInfoPO> labelQueryWrapper = new LambdaQueryWrapper<>(); labelQueryWrapper.eq(LabelInfoPO::getBusiness, LabelBusinessEnum.NEW_USER_INTEREST_LABEL.getCode()) .orderByAsc(LabelInfoPO::getWeight) ; List<LabelInfoPO> list = labelInfoMapper.selectList(labelQueryWrapper); if (CollectionUtils.isEmpty(list)) { return new ArrayList<>(); } Map<Long, LabelInfoPO> labelMap = list.stream().collect(Collectors.toMap(LabelInfoPO::getId, labelInfoPO -> labelInfoPO)); // 如果是选择标签然后提交的,需要保存用户选择记录 if (isSubmit) { for (Long labelId : labelIds) { if (!labelMap.containsKey(labelId)) { continue; } LabelRelPO labelRelPO = new LabelRelPO(); labelRelPO.setBusiness(LabelBusinessEnum.NEW_USER_LABEL_USER.getCode()); labelRelPO.setLabelId(labelId); labelRelPO.setRelId(userId); labelRelPO.setWeight(1); labelRelMapper.insert(labelRelPO); } } Set<Long> labelIdSet = list.stream().map(LabelInfoPO::getId).collect(Collectors.toSet()); LambdaQueryWrapper<LabelRelPO> queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(LabelRelPO::getBusiness, LabelBusinessEnum.NEW_USER_LABEL_BOT.getCode()) .in(LabelRelPO::getLabelId, labelIdSet) ; List<LabelRelPO> labelRelList = labelRelMapper.selectList(queryWrapper); if (CollectionUtils.isEmpty(labelRelList)) { return new ArrayList<>(); } Set<Long> botIds = labelRelList.stream().map(LabelRelPO::getRelId).collect(Collectors.toSet()); List<BotInfoVO> botInfoList = botInfoService.selectByIds(botIds); if (CollectionUtils.isEmpty(botInfoList)) { return new ArrayList<>(); } Map<Long, BotInfoVO> botInfoMap = botInfoList.stream().collect(Collectors.toMap(BotInfoVO::getId, botInfoVO -> botInfoVO)); List<BotInfoVO> resultList = new ArrayList<>(); // 开始排序 按照两个order之和进行排序,不是用户选择的对order按照系数进行膨胀,这个系数可以根据实际情况再调整,目前来说这个是够了的 labelRelList.stream() .sorted(Comparator.comparingInt(e -> (labelMap.get(e.getLabelId()).getWeight() + e.getWeight()) * (labelIds.contains(e.getLabelId()) ? 1 : 10000))) .forEach(e -> { if (resultList.size() < 20 && botInfoMap.containsKey(e.getRelId())) { resultList.add(botInfoMap.get(e.getRelId())); } }); return resultList;
这段代码主要是根据一些条件查询并排序标签和机器人信息,并返回结果列表。
首先,代码检查了 `labelIds` 是否为空或者 `userId` 是否为空,如果是,则直接返回一个空列表 `new ArrayList<>()`。
接下来,使用 `LambdaQueryWrapper` 创建了一个查询条件 `labelQueryWrapper`,并设置了业务类型为 `NEW_USER_INTEREST_LABEL`,并按照权重进行升序排序。
然后,通过 `labelInfoMapper` 执行查询操作,将查询结果保存在 `list` 中。如果查询结果为空,则同样返回一个空列表。
接着,将 `list` 转换为一个 `Map` 对象 `labelMap`,以标签的 ID 作为键,标签对象 `LabelInfoPO` 作为值。
如果 `isSubmit` 为真,则进入一个循环遍历 `labelIds`。如果 `labelMap` 中包含当前遍历的标签 ID,则创建一个 `LabelRelPO` 对象,并设置相关属性,最后将其插入到数据库中。
然后,创建一个空的 `labelIdSet` 集合,并将 `list` 中的标签 ID 添加到集合中。
再使用 `LambdaQueryWrapper` 创建一个查询条件 `queryWrapper`,设置业务类型为 `NEW_USER_LABEL_BOT`,并且标签 ID 在 `labelIdSet` 集合中。
通过 `labelRelMapper` 执行查询操作,将查询结果保存在 `labelRelList` 中。如果查询结果为空,则同样返回一个空列表。
接着,从 `labelRelList` 中提取机器人 ID,并保存在 `botIds` 集合中。
使用 `botInfoService` 根据机器人 ID 进行批量查询,将查询结果保存在 `botInfoList` 中。如果查询结果为空,则同样返回一个空列表。
将 `botInfoList` 转换为一个 `Map` 对象 `botInfoMap`,以机器人的 ID 作为键,机器人对象 `BotInfoVO` 作为值。
创建一个空的 `resultList` 列表,然后对 `labelRelList` 进行排序。排序规则是根据标签的权重和关联权重的和进行排序,并且如果标签 ID 在 `labelIds` 中存在,则乘以一个较大的系数(1 * 10000),以便放置用户选择的标签更靠前。
最后,遍历排序后的 `labelRelList`,将对应的机器人对象添加到 `resultList` 中,直到 `resultList` 的大小达到 20 或遍历完所有的标签关联记录。
最终,返回排序后的机器人列表 `resultList`。
阅读全文