gpt4 book ai didi

java-8 - 如何跳过从Files.lines获得的Stream 的偶数行

转载 作者:行者123 更新时间:2023-12-04 03:20:26 25 4
gpt4 key购买 nike

在这种情况下,只有奇数行具有有意义的数据,并且没有可以唯一标识这些行的字符。我的意图是得到等同于以下示例的内容:

Stream<DomainObject> res = Files.lines(src)
.filter(line -> isOddLine())
.map(line -> toDomainObject(line))

有没有共享全局状态的“干净”方法?

最佳答案

一种干净的方法是更深入地实现Spliterator。在此级别上,您可以控制流元素的迭代,并且只要下游请求一个项目,就可以简单地对两个项目进行迭代:

public class OddLines<T> extends Spliterators.AbstractSpliterator<T>
implements Consumer<T> {

public static <T> Stream<T> oddLines(Stream<T> source) {
return StreamSupport.stream(new OddLines(source.spliterator()), false);
}
private static long odd(long l) { return l==Long.MAX_VALUE? l: (l+1)/2; }
Spliterator<T> originalLines;

OddLines(Spliterator<T> source) {
super(odd(source.estimateSize()), source.characteristics());
originalLines=source;
}

@Override
public boolean tryAdvance(Consumer<? super T> action) {
if(originalLines==null || !originalLines.tryAdvance(action))
return false;
if(!originalLines.tryAdvance(this)) originalLines=null;
return true;
}

@Override
public void accept(T t) {}
}

然后你可以像这样使用它
Stream<DomainObject> res = OddLines.oddLines(Files.lines(src))
.map(line -> toDomainObject(line));

该解决方案没有副作用,并且保留了 Stream API的大多数优点(如惰性评估)。但是,应该清楚的是,它对于无序流处理没有有用的语义(请注意诸如对所有元素执行终端操作时使用 forEachOrdered而不是 forEach的微妙方面),并且在原则上支持并行处理时,不太可能非常有效率...

关于java-8 - 如何跳过从Files.lines获得的Stream <String>的偶数行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30170089/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com