【问题标题】:Can I add element while using Java stream groupingby我可以在使用 Java stream groupingby 时添加元素吗
【发布时间】:2022-12-04 19:52:26
【问题描述】:

For循环代码是这样的。

参数:ArrayList 用户列表


Map<String, User> map = new HashMap();


for (User user : userList) {
    String[] arr = user.getStringSeq().split(DELIMITER);
    String key = String.join(DELIMITER, arr[MENU_IDX], arr[GROUP_IDX]);

    if (Objects.isNull(map.get(key))) {
        Set<IOType> ioTypeSet = new HashSet<>();
        ioTypeSet.add(IOType.valueOf(arr[IO_TYPE_IDX]));
        user.setIoTypes(ioTypeSet);
        map.put(key, user);
    } else {
        map.get(key).getIoTypes().add(IOType.valueOf(arr[IO_TYPE_IDX]));
    }
}

我想修改流

List<List<user>> userList = userList
        .stream()
        .collect(groupingBy(
                e -> {
                    String[] arr = e.getStringSeq().split(DELIMITER);
                    return String.join(DELIMITER, arr[0], arr[1]);
                },
                mapping(e -> {
                    IOType ioType = IOType.valueOf(e.getNavAuthSeq().split(DELIMITER)[2]);
                    User user = new User();
                    user.addIoType(ioType);
                    return user;
                }, toList())
        )).values()
        .stream()
        .toList();

我的流码分组列表成功 但我想删除相同的关键元素并放入拆分的字符串 像这样


List<List<user>> userList = userList
        .stream()
        .collect(groupingBy(
                e -> {
                    String[] arr = e.getStringSeq().split(DELIMITER);
                    return String.join(DELIMITER, arr[0], arr[1]);
                },
                mapping(e -> {
                    if (e.getIoTypes() != null) {
                        e.getIoTypes().add(IOType.NONE);
                        return null;
                    } else {
                        IOType ioType = IOType.valueOf(e.getStringSeq().split(DELIMITER)[2]);
                        UserNavAuthsLoginDTO userNavAuthsLoginDTO = new UserNavAuthsLoginDTO();
                        userNavAuthsLoginDTO.addIoType(ioType);
                        return userNavAuthsLoginDTO;
                    }
                }, toList())
        )).values()
        .stream()
        .toList();

但如果其他代码不起作用 我可以解决这个问题吗?

【问题讨论】:

    标签: java stream groupingby


    【解决方案1】:

    如果你想在groupingBy之后丢弃收集器内部的某些元素,你可以用收集器filtering()包装mapping()。它需要一个 Predicate 并且只保留谓词被评估为 true 的元素。

    .collect(Collectors.groupingBy(
        e -> { },
        Collectors.filtering(e -> { },
            Collectors.mapping(e -> { },
                Collectors.toList())
        )
    ))
    

    笔记使用filter() 操作和使用 Collector filtering() 是有区别的。想象一个场景,当全部映射到特定键的元素不会传递谓词。在这种情况下,具有此密钥的条目出现在生成的 Map 中(其 Value 将是一个空列表)。如果您在流中应用 filter() - 则不会有这样的条目。

    或者,如果它是不是在分组阶段后过滤掉元素很重要,您可以使用 filter() 操作(在这种情况下这是首选方式)。

    【讨论】:

      猜你喜欢
      • 2010-10-03
      • 1970-01-01
      • 1970-01-01
      • 2014-07-20
      • 2022-07-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-15
      相关资源
      最近更新 更多