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

前端之家收集整理的这篇文章主要介绍了java-8 – 如何跳过从Files.lines获取的Stream的偶数行前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
在这种情况下,只有奇数行有意义的数据,并且没有唯一标识这些行的字符.我的目的是获得与以下示例相当的东西:
  1. Stream<DomainObject> res = Files.lines(src)
  2. .filter(line -> isOddLine())
  3. .map(line -> toDomainObject(line))

有没有任何“干净”的做法,没有分享全球国家?

解决方法

一个干净的方法是进一步深入实现一个Spliterator.在这个级别上,您可以通过流元素控制迭代,并且只要下游请求一个项目,只需迭代两个项目:
  1. public class OddLines<T> extends Spliterators.AbstractSpliterator<T>
  2. implements Consumer<T> {
  3.  
  4. public static <T> Stream<T> oddLines(Stream<T> source) {
  5. return StreamSupport.stream(new OddLines(source.spliterator()),false);
  6. }
  7. private static long odd(long l) { return l==Long.MAX_VALUE? l: (l+1)/2; }
  8. Spliterator<T> originalLines;
  9.  
  10. OddLines(Spliterator<T> source) {
  11. super(odd(source.estimateSize()),source.characteristics());
  12. originalLines=source;
  13. }
  14.  
  15. @Override
  16. public boolean tryAdvance(Consumer<? super T> action) {
  17. if(originalLines==null || !originalLines.tryAdvance(action))
  18. return false;
  19. if(!originalLines.tryAdvance(this)) originalLines=null;
  20. return true;
  21. }
  22.  
  23. @Override
  24. public void accept(T t) {}
  25. }

那么你可以使用它

  1. Stream<DomainObject> res = OddLines.oddLines(Files.lines(src))
  2. .map(line -> toDomainObject(line));

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

猜你在找的Java相关文章