我试图将以下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中实现这种迭代器的方法?我想避免使用第三方库。
答案 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
语句变为flatMap
而yield
变为map
。