Las dos opciones que conozco son la biblioteca de colecciones de infomantes de Aviad Ben Dov de 2007 y la biblioteca YieldAdapter de Jim Blackler de 2008 (que también se menciona en la otra respuesta).
Ambos le permitirán escribir código con una yield return
construcción similar en Java, por lo que ambos satisfarán su solicitud. Las diferencias notables entre los dos son:
Mecánica
La biblioteca de Aviad utiliza la manipulación de códigos de bytes, mientras que la de Jim utiliza subprocesos múltiples. Dependiendo de sus necesidades, cada uno puede tener sus propias ventajas y desventajas. Es probable que la solución de Aviad sea más rápida, mientras que la de Jim sea más portátil (por ejemplo, no creo que la biblioteca de Aviad funcione en Android).
Interfaz
La biblioteca de Aviad tiene una interfaz más limpia; aquí hay un ejemplo:
Iterable<Integer> it = new Yielder<Integer>() {
@Override protected void yieldNextCore() {
for (int i = 0; i < 10; i++) {
yieldReturn(i);
if (i == 5) yieldBreak();
}
}
};
Mientras que el de Jim es mucho más complicado, requiriendo adept
un genérico Collector
que tenga un collect(ResultHandler)
método ... uf. Sin embargo, podría usar algo como este envoltorio alrededor del código de Jim de Zoom Information que simplifica enormemente eso:
Iterable<Integer> it = new Generator<Integer>() {
@Override protected void run() {
for (int i = 0; i < 10; i++) {
yield(i);
if (i == 5) return;
}
}
};
Licencia
La solución de Aviad es BSD.
La solución de Jim es de dominio público, al igual que su envoltorio mencionado anteriormente.