非業務日誌

ファクシミリ駆動開発の現場からお届けします。

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 の効率、身につけたい。