Java是否等同于C#的'yield'关键字?

rip*_*234 104 java yield yield-return

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

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

Oak*_*Oak 89

我所知道的两个选项是2007年的Aviad Ben Dov的infomancers-collections图书馆2008年的Jim Blackler的YieldAdapter图书馆(在另一个答案中也有提到).

两者都允许您使用yield returnJava中的-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的解决方案是公共领域,上面提到的包装器也是如此.

  • 很棒的答案.你不仅完全回答了这个问题,你还是以非常清晰的方式这样做了.此外,我喜欢您的答案格式以及您如何包含许可证信息.保持真棒的回答!:) (3认同)

小智 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)

我在这里解释了一下.

  • `Yielderable`?它不应该只是"可屈服"吗?(动词只是'收益',而不是'yielder'或'yielderate'或其他什么) (3认同)
  • @LukeHutchison 不,不是。只有调用名为“yield”的方法才需要限定表达式或类型才能与“yield”语句区分开来。命名变量“yield”并使用它,不需要任何更改。 (2认同)