RxJava缓冲区/窗口直到元素受到影响

时间:2015-07-09 10:06:28

标签: rx-java

我正在尝试从阅读器读取行并将它们分组到属于一起的块。

来源文字:

bla1
bla2
### block separator ###
bla3
bla4
### block separator ###
...

我需要获得两个块(bla1,bla2)和(bla3,bla4)。

代码:

import org.apache.commons.lang3.StringUtils;
import rx.Observable;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.Reader;
import java.util.Iterator;

public class BlockBuilder {

  public static void main(String[] args) {

    try {
      FileReader fileReader = new FileReader("/path/to/some/file");
      LineIterable lineIterable = new LineIterable(fileReader);

      Observable.from(lineIterable)
          .buffer(100)
          // Needed instead of time/count: until line matches condition
          // something like .buffer(line -> line.equals("### block separator ###")
          .forEach(gatheredLines -> {
            String gatheredBlock = StringUtils.join(gatheredLines, '\n');
            System.out.println(gatheredBlock);
            System.out.println("###### ###### ###### ######");
          });
    } catch (Exception ex) {
      ex.printStackTrace();
    }
  }

  private static class LineIterable implements Iterable<String> {
    private final Iterator<String> iterator;
    public LineIterable(Reader reader) {
      iterator = new BufferedReader(reader).lines().iterator();
    }
    @Override
    public Iterator<String> iterator() {
      return iterator;
    }
  } 
}

如果使用缓冲区或窗口,或者考虑到这两者是完全错误的,这无关紧要。

我认为必须可以使用缓冲区的 bufferClosingSelector 或窗口的 closingSelector 。 两者都是创建Observer的函数,它可以触发当前缓冲区或窗口的关闭,但是我无法在这里看到我能抓住当前行的位置。

1 个答案:

答案 0 :(得分:3)

您可以发布源并将其用于缓冲和缓冲区边界:

Observable<String> source = Observable.just(
        "a", "b", "#", 
        "c", "d", "e", "#", 
        "f", "g");

source.publish(p -> 
        p.filter(v -> !"#".equals(v))
        .buffer(() -> p.filter(v -> "#".equals(v))))
.subscribe(System.out::println);