阻塞嵌套循环迭代器

时间:2016-11-15 02:52:39

标签: java python

我试图将以下Python生成器移植到Java Iterator

def gen_sums(blocks1, blocks2):
  for b1 in blocks1:
    for b2 in blocks2:
      for n1 in b1:
        for n2 in b2:
          yield n1 + n2

在Java版本中,界面如下所示:

public class Block {
  ...

  public Iterator<Integer> iterator() { ... }
}

public class GenSums implements Iterator<Integer> {
  private Iterator<Block> blocks1;
  private Iterator<Block> blocks2;

  ...

  @Override
  public boolean hasNext() { /* TODO */ }

  @Override
  public Integer next() { /* TODO */ }
}

...我发现我很难做对。只有很多状态存储在GenSums类中,并从中恢复。有没有&#34;标准&#34;在Java中实现这种迭代器的方法?我想避免使用第三方库。

1 个答案:

答案 0 :(得分:1)

如果您使用的是Java 8,那么您可能需要考虑生成流而不是迭代器。如果需要,可以将流转换为迭代器(使用BaseStream.iterator())。

所以,例如:

class Block {
    private final int[] b;

    public IntStream getBs() {
        return Arrays.stream(b);
    }
}

public IntStream generate(List<Block> block1, List<Block> block2) {
    return block1.stream()
        .flatMapToInt(b1 -> block2.stream()
            .flatMapToInt(b2 -> b1.getBs()
                .flatMap(n1 -> b2.getBs().map(n2 -> n1 + n2)));
}

正如您所看到的那样,它非常接近Python中的等价物 - for语句变为flatMapyield变为map