用和对象的方法初始化流的最佳方法是什么?
Foo foo1 = new Foo();
Foo foo2 = foo1.getNext();
Foo foo3 = foo2.getNext();我想要一股水,foo1,foo2,.通过getNext()方法。
我试过了
Stream.iterate
Stream.generate但是这些方法返回无限流。
发布于 2018-07-13 05:42:24
问题中没有具体说明,但我相信当getNext()返回null时,您应该停止迭代(这似乎是最有意义的)。
如果是这样,至少有三种方法:
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)发布于 2018-07-12 20:11:20
可能会想到的第一个想法是用limit截断流
Stream.iterate(foo1, Foo::getNext)
.limit(size)....但显然,如果大小未知,这是没有用的。
如果大小是未知的,那么肯定会有某种条件说“停止,不再”。
Stream.iterate(foo1, Foo::getNext)
.takeWhile(f -> someCondition)
.... // further intermediate or a terminal operation或者:
Stream.iterate(foo1, f -> someCondition, Foo::getNext)
.... // further intermediate or a terminal operation如果不能使用JDK-9,那么唯一的其他选项是创建自己的助手方法来执行所追求的逻辑。
https://stackoverflow.com/questions/51308756
复制相似问题