首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从对象的方法创建流

从对象的方法创建流
EN

Stack Overflow用户
提问于 2018-07-12 14:53:06
回答 2查看 66关注 0票数 0

用和对象的方法初始化流的最佳方法是什么?

代码语言:javascript
复制
Foo foo1 = new Foo();
Foo foo2 = foo1.getNext();
Foo foo3 = foo2.getNext();

我想要一股水,foo1,foo2,.通过getNext()方法。

我试过了

代码语言:javascript
复制
Stream.iterate
Stream.generate

但是这些方法返回无限流。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-07-13 05:42:24

问题中没有具体说明,但我相信当getNext()返回null时,您应该停止迭代(这似乎是最有意义的)。

如果是这样,至少有三种方法:

  1. 如果在JDK 9+上,按照奥米内的建议执行: Stream.iterate(foo1,Object::nonNull,Foo::getNext)
  2. 如果您不介意在JDK 8上引入额外的依赖项,请使用jOOλ及其iterateWhilePresent方法: Seq.iterateWhilePresent(foo1,foo -> Optional.ofNullable(foo.getNext))
  3. 如果在JDK 8上不想引入额外的依赖项,那么编写一个使用自定义Spliterator的方法(注意,这不是最有效的实现,因为它急切地调用generator ): 公共静态流iterateUntilNull(T种子,UnaryOperator生成器){ Spliterator分配器=新Spliterator() {私有T next = seed;@重写公共布尔tryAdvance(Consumer<?超级T>操作){ if (next == null) {返回false;} action.accept( next );next= generator.apply(next);返回true;}@覆盖公共剪贴器trySplit() {返回null;}@覆盖公共长estimateSize() {返回Long.MAX_VALUE;}@覆盖公共int特征(){返回Spliterator.NONNULL;};返回StreamSupport.stream(分配器,false);} 然后打电话: iterateUntilNull(foo1,Foo::getNext)
票数 0
EN

Stack Overflow用户

发布于 2018-07-12 20:11:20

可能会想到的第一个想法是用limit截断流

代码语言:javascript
复制
Stream.iterate(foo1, Foo::getNext)
      .limit(size)....

但显然,如果大小未知,这是没有用的。

如果大小是未知的,那么肯定会有某种条件说“停止,不再”。

JDK-9提供了这些重载:

代码语言:javascript
复制
Stream.iterate(foo1, Foo::getNext)
      .takeWhile(f -> someCondition)
      ....  // further intermediate or a terminal operation

或者:

代码语言:javascript
复制
Stream.iterate(foo1, f -> someCondition, Foo::getNext)
      .... // further intermediate or a terminal operation

如果不能使用JDK-9,那么唯一的其他选项是创建自己的助手方法来执行所追求的逻辑。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51308756

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档