我知道Java本身没有直接的等效项,但也许是第三方?

真的很方便。当前,我想实现一个迭代器,该迭代器生成树中的所有节点,这大约是带有yield的五行代码。

最佳答案

我知道的两个选项是Aviad Ben Dov's infomancers-collections library from 2007Jim Blackler's YieldAdapter library from 2008(在另一个答案中也提到了)。

两者都允许您使用类似于yield return的Java构造来编写代码,因此两者都可以满足您的要求。两者之间的显着区别是:

机械学

Aviad的库使用字节码操作,而Jim的库使用多线程。根据您的需求,每个都有各自的优点和缺点。 Aviad的解决方案可能更快,而Jim的解决方案更可移植(例如,我认为Aviad的库不能在Android上运行)。

接口(interface)

Aviad的库具有更简洁的界面-这是一个示例:

Iterable<Integer> it = new Yielder<Integer>() {
    @Override protected void yieldNextCore() {
        for (int i = 0; i < 10; i++) {
            yieldReturn(i);
            if (i == 5) yieldBreak();
        }
    }
};

虽然Jim的方法要复杂得多,但要求您adept一个通用的Collector,它具有collect(ResultHandler)方法...嗯。但是,您可以使用this wrapper around Jim's code by Zoom Information之类的东西来简化操作:
Iterable<Integer> it = new Generator<Integer>() {
    @Override protected void run() {
        for (int i = 0; i < 10; i++) {
            yield(i);
            if (i == 5) return;
        }
    }
};

执照

Aviad的解决方案是BSD。

Jim的解决方案是公共(public) Realm ,上面提到的包装器也是如此。

09-30 14:32
查看更多