Python の ジェネレータをJavaで表現
Python の ジェネレータをJavaで理解
Python の ジェネレータが優れもののようなので、 自分の理解のためにJavaで実装するならばどうなるか考えてみました。
python の ジェネレータ
- ジェネレータ関数の戻り値は、ジェネレータイテレータと呼ばれるイテレータ
- 特殊メソッド __next__() が呼ばれるたびに、関数内の処理が次の yield 式まで進む
- 呼び出し元にyield 式に渡した値を返すと、その状態を保持したまま、その行で処理中断
- 再度特殊メソッド__next()__ が呼ばれると、次の行から処理が再開
- 関数を抜けるとStopIterationが送出
def gens(n): while n: print(f'yield: {n}') yield n n -= 1
関数実行
gen = gen_func(2) next(gen) # yield: 2 next(gen) # yield: 1 # next(gen) ここで例外
Javaによる実装考察
値を実行の都度生成するイメージで。
class Gens implements Iterable<Integer>, Iterator<Integer> { private Integer num; Gens(Integer num) { this.num = num; } @Override public Iterator<Integer> iterator() { return this; } @Override public boolean hasNext() { return 0 < num; } @Override public Integer next() { Integer ret = num; num = num - 1; return ret; } }
多分、こんな感じになると思われます。
うん。Python の効率、身につけたい。