
如果你:
- 不喜欢使用流中所有字符串创建列表的想法
- 不想使用外部库
- 喜欢弄脏你的手
然后可以从使用Java
8低电平流助洗剂流创建到组元素的方法
StreamSupport和
Spliterator:
class StreamUtils { public static<T> Stream<List<T>> sliding(int size, Stream<T> stream) { return sliding(size, 1, stream); } public static<T> Stream<List<T>> sliding(int size, int step, Stream<T> stream) { Spliterator<T> spliterator = stream.spliterator(); long estimateSize; if (!spliterator.hasCharacteristics(Spliterator.SIZED)) { estimateSize = Long.MAX_VALUE; } else if (size > spliterator.estimateSize()) { estimateSize = 0; } else { estimateSize = (spliterator.estimateSize() - size) / step + 1; } return StreamSupport.stream( new Spliterators.AbstractSpliterator<List<T>>(estimateSize, spliterator.characteristics()) { List<T> buffer = new ArrayList<>(size); @Override public boolean tryAdvance(Consumer<? super List<T>> consumer) { while (buffer.size() < size && spliterator.tryAdvance(buffer::add)) { // Nothing to do } if (buffer.size() == size) { List<T> keep = new ArrayList<>(buffer.subList(step, size)); consumer.accept(buffer); buffer = keep; return true; } return false; } }, stream.isParallel()); }}方法和参数的命名受到了Scala同行的启发。
让我们测试一下:
Stream<String> testing = Stream.of("A", "Apple", "B", "Banana", "C", "Carrot");System.out.println(StreamUtils.sliding(2, testing).collect(Collectors.toList()));[[A,Apple],[Apple,B],[B,Banana],[Banana,C],[C,Carrot]]
关于不重复元素呢:
Stream<String> testing = Stream.of("A", "Apple", "B", "Banana", "C", "Carrot");System.out.println(StreamUtils.sliding(2, 2, testing).collect(Collectors.toList()));[[A,Apple],[B,Banana],[C,Carrot]]
现在具有无限
Stream:
StreamUtils.sliding(5, Stream.iterate(0, n -> n + 1)) .limit(5) .forEach(System.out::println);
[0、1、2、3、4]
[1、2、3、4、5]
[2、3、4、5、6]
[3、4、5、6、7]
[4、5、6 ,7,8]
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)