当前位置: 首页 > 知识库问答 >
问题:

为什么没有提供流的接口?

胡景焕
2023-03-14

为了防止实现细节泄漏,可以实现iterable ,而不是返回集合 ,然后需要从iterable接口实现迭代器 。因此,无论内部数据结构如何管理,对元素的访问都是通过迭代器进行的。

对于Java8,可能希望将stream stream() 添加到myCoolObject。(另请参阅《Java8lambdas》一书中关于支持stream的建议)。虽然添加方法并不困难(我也读过关于为什么Iterable不提供流的问题),但奇怪的是Java没有为Streamable 添加接口来镜像Iterable 思想。(好吧,可能有一个不同的名称,因为streamable是为了永远使用CORBA的东西而存在的)。

我想我已经回答了为什么将stream添加到iterable可能会有问题,但我不明白为什么不能提供streaming 接口。例如,collections可以实现streaming 接口,对于其他对象来说,这会使我们更清楚地看到一个stream()方法。

根据对上述问题的回答,可以通过以下方式从iterable获取

Stream s = StreamSupport.stream(iter.spliterator(), false);

但鉴于MyObject可能希望只实现stream()以允许对象的用户执行以下操作,这似乎需要大量的工作

myObject.stream().filter(...).collect(...)

而不需要从迭代器进行中间转换。

缺少流式处理对象的接口是有原因的吗?除了在MyCoolObject上实现stream()并让用户查看Javadoc以便知道它有stream()方法之外,还有更好的方法吗?

共有1个答案

巫马自明
2023-03-14

这可能会增加将来的答案。

我不知道为什么您认为返回一个可迭代的 而不是一个集合 更好。它可能确实隐藏了细节,而且还会制造更多的问题。

集合的已知大小在进行并行处理的拆分时起着很大的作用。这被报告为spliterator.sized spliterator.sublided。因此,collection.stream将比iterable更好地处理并行流,它将使用:

public static <T> Spliterator<T> spliteratorUnknownSize 

记录为:

...并实现trySplit以允许有限的并行性。

这很明显,因为你根本不知道大小。在当前实现下,批处理大小为1024。因此,例如,对于1024个元素以下的任何东西,您将不会得到任何并行化。

String::codePoints()
File::lines
Pattern::splitAsStream
... many others

以下是删除的原因:

我正在考虑放弃流式接口。目前唯一的实现者是Collection,所有其他包含流的方法都提供专用流(chars()、codePoints()、lines()等),其方法名比“stream”更合适。所以我认为我们应该删除Streamable并将stream()/parallel()方法保留在Collection上(或者可能将它们向上移动为Iterable)。

 类似资料:
  • 问题内容: 罐(bcprov-jdk16-145.jar)已添加到项目中,已添加到类中,并且确实返回“ BC”,但AesFileIo.writeFile()仍会抛出。有任何想法吗? 问题答案: 我对Android sdk不太熟悉,但是似乎提供程序附带的安全性已经增加了。 在PC环境中,您只需手动添加即可, 如果您有权访问该文件,只需添加一个条目,如: 注意,它等于已添加的提供程序的序号。

  • 如果你按照这些说明开始使用kubernetes,你添加一个apt源(德布http://apt.kubernetes.io/ kubernetes-xenial main)并被告知安装软件包“docker-engine”。这个包由kubernetes apt库提供,与Ubuntu (docker.io)提供的包冲突。 Kubernetes仓库中的docker引擎软件包和Ubuntu xenial中的

  • 我正在开发一个应用程序,它提取其他应用程序的Swagger规范并为它们推断一个UI,具有与API交互所需的所有功能。 现在,我在尝试实现OAuth2身份验证时遇到了一个问题。使用OAuth2,您始终需要注册的cientId才能获得访问令牌。问题在于,swagger规范不需要在OAuth2安全定义中提供clientId。 这意味着clientId应该在用户想要访问的任何OAuth2服务器中为我自己的

  • 问题内容: 在Java has 方法中,但是,它仅在诸如或的关联容器中使用。为什么要这样设计?具有方法的界面看起来更优雅。 问题答案: 在我看来,主要的论据是,可以为任何Java对象计算出一个定义明确的默认值,以及一个同样定义明确的。根本没有充分的理由要保留所有对象的该功能,当然也有很多理由 不 保留此功能。因此,这本书毫无疑问。

  • 问题内容: 我正在使用: Python 3.4.2 PyMongo 3.0.2 mongolab运行mongod 2.6.9 uWSGI 2.0.10 CherryPy 3.7.0 nginx 1.6.2 uWSGI启动参数: 我一次设置了MongoClient: 我尝试将JSON字典保存到MongoDB: 它通过执行与mongodb相同的代码路径的单元测试来工作。但是,当我使用HTTP POST

  • 在Java8中,我们有类stream ,奇怪的是,它有一个方法 所以您希望它实现interface Iterable ,这恰恰需要这个方法,但事实并非如此。 当我想使用foreach循环对流进行迭代时,我必须执行如下操作 我是不是漏了什么?