空列表上的Java 8流操作

时间:2019-02-03 09:21:53

标签: java java-8 java-stream

我只是想知道空列表上Java 8流的行为。

// e.g. this is in my GraphQL resolvers async function...

await prisma.deleteManyTaskItems({
  task: {
    taskGroup: {
      board: {
        id: boardId
      }
    }
  }
});

await prisma.deleteManyTasks({
  taskGroup: {
    board: {
      id: boardId
    }
  }
});

await prisma.deleteManyTaskGroups({
  board: {
    id: boardId
  }
});

return await prisma.deleteBoard({ id: boardId });

这将是空列表还是null。我知道流会进行延迟传播,因此在这种情况下,将调用go到collect()方法,或者只是将其终止于stream()方法。

2 个答案:

答案 0 :(得分:7)

collect是终端操作,因此必须对其进行评估。

使用Stream终止collect(Collectors.toList())管道时,您将始终获得输出List(永远不会得到null)。如果Stream为空(由于流的源为空,或者由于流的所有元素在终端操作之前被过滤掉了,它是否为空都没有关系),则输出List也将为空。

答案 1 :(得分:0)

您将获得一个空集合。 在doc中对收集进行了说明:

  

使用收集器对该流的元素执行可变的约简操作。

可变减少

  

可变归约运算在处理流中的元素时将输入元素累积到可变结果容器(例如Collection或StringBuilder)中。

由于原点输入为空或由于过滤操作,您将获得一个空集合。

感谢@Andy Turner的提示。

  

toList()会累积到一个新列表中,这意味着它不会返回null。

此文档将通过以下方式为Collectors.toList()进行解释:

  

返回将输入元素累积到新列表中的收集器。

我们可以从源代码中获得

    public static <T>
    Collector<T, ?, List<T>> toList() {
        return new CollectorImpl<>((Supplier<List<T>>) ArrayList::new, List::add,
                                   (left, right) -> { left.addAll(right); return left; },
                                   CH_ID);
    }

它永远不会产生null输出,但是您仍然可以像Andy所示使用定制的Collector获得null。