rip*_*234 104 java yield yield-return
我知道Java本身没有直接的等价物,但也许是第三方?
真的很方便.目前我想实现一个迭代器,它产生一个树中的所有节点,这是大约五行带有yield的代码.
Oak*_*Oak 89
我所知道的两个选项是2007年的Aviad Ben Dov的infomancers-collections图书馆和2008年的Jim Blackler的YieldAdapter图书馆(在另一个答案中也有提到).
两者都允许您使用yield return
Java中的-like构造编写代码,因此两者都将满足您的请求.两者之间的显着差异是:
当Jim使用多线程时,Aviad的库正在使用字节码操作.根据您的需要,每个人都有自己的优点和缺点.可能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();
}
}
};
Run Code Online (Sandbox Code Playgroud)
虽然吉姆的方式更复杂,但要求你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;
}
}
};
Run Code Online (Sandbox Code Playgroud)
Aviad的解决方案是BSD.
Jim的解决方案是公共领域,上面提到的包装器也是如此.
小智 13
现在,Java拥有Lambdas,这两种方法都可以变得更加清晰.你可以做点什么
public Yielderable<Integer> oneToFive() {
return yield -> {
for (int i = 1; i < 10; i++) {
if (i == 6) yield.breaking();
yield.returning(i);
}
};
}
Run Code Online (Sandbox Code Playgroud)