一尘不染

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

java

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

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


阅读 248

收藏
2020-09-09

共1个答案

一尘不染

我知道的两个选项是2007年的Aviad Ben Dov的infomancers-
collections库
2008年的Jim
Jimler的YieldAdapter库
(在另一个答案中也提到了)。

两者都允许您使用yield returnJava中的-like结构编写代码,因此两者都可以满足您的要求。两者之间的显着区别是:

机械学

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的代码使用类似这样的包装器,从而大大简化:

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的解决方案是公共领域,上面提到的包装器也是如此。

2020-09-09