我知道Java本身没有直接的等效项,但也许是第三方?
真的很方便。当前,我想实现一个迭代器,该迭代器生成树中的所有节点,这大约是带有yield的五行代码。
最佳答案
我知道的两个选项是Aviad Ben Dov's infomancers-collections library from 2007和Jim 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 ,上面提到的包装器也是如此。