返回Stream <T>的方法是否安全?

Cht*_*ect 12 java java-8 java-stream

我有一种情况,我正在读取数据库并返回a List<String>,其中每个字符串被选中并根据某些条件添加到列表中.方法签名是:

public List<String> myMethod(String query, int limit)
Run Code Online (Sandbox Code Playgroud)

第二个参数提供返回列表大小的上限(设置limit=-1将删除任何大小限制).为了避免使这个方法占用大量内存,我编写了一个返回Stream<String>而不是列表的等效方法.(注意:我不需要随机访问返回的元素或任何其他特定于列表的功能.)

但是,我对返回a有点怀疑Stream<>,特别是因为该方法是公开的.使用Stream<>Java 返回公共方法是否安全?

Mar*_*nik 13

它不仅安全,而且是Java首席架构师推荐的.

特别是如果您的数据是基于I/O的,并且因此在myMethod调用时尚未在内存中实现,则最好返回Stream而不是List.客户端可能只需要使用它的一部分或将其聚合成一些固定大小的数据.因此,您有机会从O(n)内存需求转到O(1).

请注意,如果并行化对于您的用例也是一个有趣的想法,那么建议您使用自定义分裂器,其分割策略适应I/O数据源的顺序性质.在这种情况下,我可以推荐一个的博客文章,它提出了这样一个分裂者.

  • @ChthonicProject嗯,这很简单:如果您的流由I/O资源支持,那么肯定需要关闭.这是您必须做出的选择 - 急切地将所有内容复制到堆上,释放I/O资源,或者拥有一个需要关闭的流.但我会争论如下:有一个方法可以安全地将I/O支持的流转换为堆上列表,这是微不足道的.另一个方向是不可能的.因此,通过使用Stream,您只需添加灵活性. (2认同)
  • 是的,流是'AutoCloseable`. (2认同)