当前位置: 首页 > 面试题库 >

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

丁雅惠
2023-03-14
问题内容

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

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


问题答案:

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



 类似资料:
  • 问题内容: 我知道我们可以使用Java中的方法通过指定其位置来获取字符串中的单个字符。C#中有等效的方法吗? 问题答案: 您可以像数组一样索引C#中的字符串,然后在该索引处获取字符。 例: 在Java中,您会说 在C#中,您会说

  • 本文向大家介绍C#是否等效于Java的Thread.setDaemon?,包括了C#是否等效于Java的Thread.setDaemon?的使用技巧和注意事项,需要的朋友参考一下 与Java的Thread.setDaemon等效的C#是前台线程和后台线程的概念。 当前台线程关闭时,后台线程将终止。前台线程继续运行,直到最后一个前台线程终止。 用于后台线程的属性是IsBackground,该属性获取

  • 问题内容: 是否有与C ++等效的Java Map keySet()? Java 方法返回“此映射中包含的键的设置视图”。 问题答案: 也许以下可能有用: 使用STL兼容序列(例如std :: vector,std :: deque或std :: list)的 make_key_set 函数的重载可以如下所示:

  • 问题内容: 来自C和C ++背景,我发现明智地使用typedef会带来极大帮助。您是否知道在Java中实现类似功能的方法,无论是Java机制,模式还是您使用的其他有效方法? 问题答案: Java具有原始类型,对象和数组,仅此而已。没有typedef。

  • 问题内容: 如何在Java中解码使用HttpServerUtility.UrlTokenEncode在C#中编码的字符串? 问题答案: 我尝试使用(ctor接受一个参数,说明编码/解码是否是url安全的),但事实证明它的实现方式与UrlTokenEncode / Decode不同。 我最终将C#实现迁移到Java:

  • 问题内容: 在JavaScript中: C#应用程序是否等效?为了转义HTML字符,我使用了: 但是我不确定如何将匹配项转换为JS使用的正确十六进制格式。例如此代码: 返回“ 的,而不是它看起来像我需要了分割字符串为字节或东西。 编辑:这是一个Windows应用程序中,唯一可用的项目有:,,和。 问题答案: 或者是转义旨在成为URL一部分的字符串的正确方法。 以字符串为例: -> -> ->也编码