从 Nullable 对象创建 Stream 的惯用方法

新手上路,请多包涵

在生成流之前执行 空检查最佳/惯用 方法是什么?

我有一个接收 List 的方法,它可能是 null 。所以我不能只对传递的值调用 stream() 。如果值为空,是否有一些静态助手会给我一个空流?

原文由 checketts 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 621
2 个回答

我同意 Stuart Marks 的观点,即 list == null ? Stream.empty() : list.stream() 是执行此操作的正确方法(请参阅 他的回答),或者至少是执行此 pre-Java 9 的正确方法(请参阅下面的编辑),但我会离开此答案最多可演示 Optional API 的用法。

 <T> Stream<T> getStream(List<T> list) {
    return Optional.ofNullable(list).map(List::stream).orElseGet(Stream::empty);
}


编辑: Java 9 添加了静态工厂方法 Stream.<T>ofNullable(T) ,它在给定 null 参数的情况下返回空流,否则返回以参数作为其唯一元素的流。如果参数是一个集合,那么我们可以 flatMap 将它变成一个流。

 <T> Stream<T> fromNullableCollection(Collection<? extends T> collection) {
    return Stream.ofNullable(collection).flatMap(Collection::stream);
}

这不会像 Stuart Marks 所讨论的那样滥用 Optional API,并且与三元运算符解决方案相比,没有空指针异常的机会(就像您没有注意并搞砸了操作数的顺序一样)。它还可以使用上界通配符而不需要 SuppressWarnings("unchecked") 多亏了 flatMap 的签名,所以你可以获得 Stream<T> 的任何元素集合 T 的亚型。

原文由 gdejohn 发布,翻译遵循 CC BY-SA 4.0 许可协议

我能想到的最好的办法是使用 OptionalorElseGet 方法。

 return Optional.ofNullable(userList)
                .orElseGet(Collections::emptyList)
                .stream()
                .map(user -> user.getName())
                .collect(toList());

更新@Misha 的建议使用 Collections::emptyList 超过 ArrayList::new

原文由 checketts 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题