我知道 Java 本身没有直接的等价物,但也许有第三方?
真的很方便。目前我想实现一个迭代器,它生成树中的所有节点,大约有五行带有yield的代码。
我知道的两个选项是Aviad Ben Dov 2007 年的 infomancers-collections 图书馆 and Jim Blackler 2008 年的 YieldAdapter 库(在另一个答案中也提到了)。
两者都允许您编写代码yield return
- 类似于 Java 中的构造,因此两者都可以满足您的要求。两者之间的显着差异是:
力学
Aviad 的库使用字节码操作,而 Jim 的库使用多线程。根据您的需求,每种方法可能都有其自身的优点和缺点。 Aviad 的解决方案可能更快,而 Jim 的解决方案更便携(例如,我认为 Aviad 的库不适用于 Android)。
界面
Aviad 的库有一个更清晰的界面 - 这是一个示例:
Iterable<Integer> it = new Yielder<Integer>() {
@Override protected void yieldNextCore() {
for (int i = 0; i < 10; i++) {
yieldReturn(i);
if (i == 5) yieldBreak();
}
}
};
虽然吉姆的要复杂得多,要求你adept
一个通用的Collector
其中有一个collect(ResultHandler)
方法……呃。但是,您可以使用类似的东西Zoom Information 围绕 Jim 的代码进行的包装这大大简化了:
Iterable<Integer> it = new Generator<Integer>() {
@Override protected void run() {
for (int i = 0; i < 10; i++) {
yield(i);
if (i == 5) return;
}
}
};
License
Aviad 的解决方案是 BSD。
Jim 的解决方案是公共领域的,上面提到的它的包装器也是公共领域的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)