字符串 流 java_java – 如何将字符串流转换为字符串流对?

如果你:

>不喜欢创建包含流中所有字符串的列表的想法

>不想使用外部库

>喜欢弄脏你的手

然后,您可以使用Java 8低级流构建器StreamSupport和Spliterator创建一种从流中对元素进行分组的方法:

class StreamUtils {

public static Stream> sliding(int size, Stream stream) {

return sliding(size, 1, stream);

}

public static Stream> sliding(int size, int step, Stream stream) {

Spliterator 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>(estimateSize, spliterator.characteristics()) {

List buffer = new ArrayList<>(size);

@Override

public boolean tryAdvance(Consumer super List> consumer) {

while (buffer.size() < size && spliterator.tryAdvance(buffer::add)) {

// Nothing to do

}

if (buffer.size() == size) {

List keep = new ArrayList<>(buffer.subList(step, size));

consumer.accept(buffer);

buffer = keep;

return true;

}

return false;

}

}, stream.isParallel());

}

}

方法和参数命名的灵感来自他们的Scala对应物.

我们来测试一下:

Stream 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 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]]

现在有一个无限的流:

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]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值