效果如下
public class GeneratorTest {
private int a = 0;
private int b = 1;
@Test
public void test2() {
Generator<Integer> generator = new Generator<>();
generator.loop()
.and(() -> a += b)
.and(y -> y.yield(b))
.and(() -> b += a)
.until(y -> y.yieldIf(b > 1000).yieldBreak().yieldElse().yield(a));
for (Integer result : generator) {
System.out.print("result = " + result);
System.out.print(" a = " + a);
System.out.println(" b = " + b);
}
}
}
运行结果
result = 1 a = 1 b = 1
result = 1 a = 1 b = 2
result = 2 a = 3 b = 2
result = 3 a = 3 b = 5
result = 5 a = 8 b = 5
result = 8 a = 8 b = 13
result = 13 a = 21 b = 13
result = 21 a = 21 b = 34
result = 34 a = 55 b = 34
result = 55 a = 55 b = 89
result = 89 a = 144 b = 89
result = 144 a = 144 b = 233
result = 233 a = 377 b = 233
result = 377 a = 377 b = 610
之前把另一个项目某模块从 bio 改成了 nio,尝到了协程的甜头,宽带可以跑满,基本不占 cpu.于是打算把剩余的模块改完.结果发现连接状态一多,handler 就会越来越长,如果还有条件和循环,那就几乎没法写了.于是我就想 java 如果有 yield 就好了.
目前实现 yield 的方法有三种,第一种是改字节码,但是比想象中麻烦,第二种是返回一个阻塞队列,yield()是阻塞方法,将结果用其他线程返回,但是涉及到多线程,而原来的目的就是像把项目改成协程的.所以就用了第三种,把需要 yield 的代码块当成 lambda,传入链表中依次调用,如果调用了参数的 yield 的方法就返回一次结果;
做完以后感觉自己走了弯路.java 有没有类似的包或者工具?用 stream 能不能达到类似效果?
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.