我知道Java本身没有直接的等效项,但也许是第三方?
真的很方便。当前,我想实现一个迭代器,该迭代器生成树中的所有节点,这大约是带有yield的五行代码。
我知道的两个选项是2007年的Aviad Ben Dov的infomancers- collections库和2008年的Jim Jimler的YieldAdapter库(在另一个答案中也提到了)。
两者都允许您使用yield returnJava中的-like结构编写代码,因此两者都可以满足您的要求。两者之间的显着区别是:
yield return
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(); } } };
虽然Jim的方法要复杂得多,但要求您adept使用Collector具有collect(ResultHandler)方法的泛型…嗯。但是,您可以在Zoom Information中对Jim的代码使用类似这样的包装器,从而大大简化:
adept
Collector
collect(ResultHandler)
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的解决方案是公共领域,上面提到的包装器也是如此。