有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java收集集合字段的所有值

我有一个集合,它有一个类型为Set的字段,其中包含一些值。我需要创建一个收集所有这些值的新集合

我想知道这是否可以使用lambda表达式

下面是代码行:

Set<String> teacherId = batches.stream()
                               .filter(b -> !CollectionUtils.isEmpty(b.getTeacherIds()))
                               .map(b -> b.getTeacherIds())
                               .collect(Collectors.toSet());

问题是post映射操作,它包含一组字符串。所以collect操作返回一个Set<Set<String>>,但我希望将所有值聚合到一个集合中


共 (4) 个答案

  1. # 1 楼答案

    您可以使用flatMap获取所有值的平面Stream,然后收集到Set<String>

    Set<String> teacherId = 
        batches.stream()
               .filter(b -> !CollectionUtils.isEmpty(b.getTeacherIds()))
               .flatMap(b -> b.getTeacherIds().stream())
               .collect(Collectors.toSet());
    
  2. # 2 楼答案

    如果您关心getTeacherIds()不是空的,请通过!=显式使用它,因为CollectionUtils.isEmpty只是隐藏内容。特别是因为如果getTeacherIds()返回一个空集合,那么flatMap就可以很好地处理它,所以对我来说,这根本不需要

      Set<String> teacherIds = batches
                .stream()
                .filter(x -> x.getTeacherIds() != null)
                .flatMap(x -> x.getTeacherIds().stream())
                .collect(Collectors.toSet());
    
  3. # 3 楼答案

    I am wondering if this is possible using lambda expressions.

    我抓到了最后一条鱼,:)

    Set<String> teacherIds = batches.stream()//v--- the class of `x`
                                    .map(XClass::getTeacherIds)
                                    .filter(Objects::nonNull)
                                    .flatMap(Collection::stream)
                                    .collect(Collectors.toSet());
    

    注意:很抱歉,我忘了告诉您,如果getTeacherIds将内部ID复制到一组新的ID,上面的代码适合您。因为它从XClass读取ID一次

  4. # 4 楼答案

    您需要使用^{}而不是map

    Set<String> teacherIds = 
        batches.stream()
               .flatMap(b -> b.getTeacherIds().stream())
               .collect(Collectors.toSet());
    

    请注意,过滤对于空集合是多余的——流式传输空集合只会导致空流,这不会影响最终结果。 但是,如果getTeacherIds()可以返回null,您仍然需要处理它。使用filter(Objects::nonNull)就足够了,并且可以避免对Apache Commons的依赖