当前位置: 首页 > 面试题库 >

如何最好地从可为空的对象创建Java 8流?

莫兴言
2023-03-14
问题内容

在获取流之前进行空检查的最佳/惯用方式是什么?

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


问题答案:

我同意Stuart Marks的观点,这list == null ? Stream.empty() : list.stream()是执行此操作的正确方法(请参见他的回答),或者至少是在Java
9之前的版本中进行此操作的正确方法(请参见下面的编辑),但是我将保留此答案以演示对可选API。

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

编辑: Java
9添加了static工厂方法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>从的任何子类型的元素集合中获取a
T



 类似资料:
  • 我有一个方法,它接受一个内部有的对象: MatchData k可以是null,有时k.getWatchListDetail()也可以是null。 我需要检查两种情况。首先,如果它能抛出NPE。 上面的实现可以做到这一点,但我尝试使用或带有链接的流,所以我可以在一行链接中完成。

  • 我试图将每个列表都位于嵌套对象内的webservice模型映射到更简单的对象。 模型1 映射非常简单: 映射工作正常,除了一个问题。当我将带有null子级的父母映射到父母2并返回父母时,儿童对象是用空列表创建的。有什么方法可以防止这种情况吗?

  • 问题内容: 尽管有一些阅读,但我遇到了一些我仍难以理解的代码。调用了一个方法,该方法需要两个参数,其中一个是Runnable。尽管有一个lambda,但没有传递Runnable对象。 例如: 所以我的问题是,你能解释一下如何从lambda创建一个Runnable吗,也请有人解释一下语法 () -> {}。具体来说,()括号是什么意思? 谢谢。 问题答案: Lambda可以在需要功能接口的任何地方使

  • 我试图理解Java8流。我有两门课: 以及: 字段应指示全天的卡路里总量是否为。该字段与当天的所有条目相同。 我试图从

  • 问题内容: 我需要从URL对象创建一个File对象我的需求是我需要创建一个网络图像的文件对象(例如googles徽标) 问题答案: 您可以利用以便从URL加载图像,然后将其写入文件。像这样: 如果需要,这还允许您将图像转换为其他格式。

  • 是否可以从迭代器创建一个流,其中对象的序列与通过反复调用迭代器的next()方法生成的序列相同?我所考虑的具体情况涉及到Treeset.desceningIterator()返回的迭代器的使用,但是我可以想象在其他情况下,迭代器是可用的,而不是它所引用的集合。 例如,对于,我们可以编写并按照该集合的排序顺序获取该集合中的对象流,但是如果我们希望它们按照不同的顺序,比如通过使用获得的顺序呢?我想象的