我只是想知道空列表上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()方法。
答案 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。