Sé que no hay un equivalente directo en Java en sí, pero ¿quizás un tercero?
Es realmente conveniente. Actualmente, me gustaría implementar un iterador que produzca todos los nodos en un árbol, que son aproximadamente cinco líneas de código con rendimiento.
java
yield
yield-return
destripador234
fuente
fuente
Respuestas:
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:
Mientras que el de Jim es mucho más complicado, requiriendo
adept
un genéricoCollector
que tenga uncollect(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: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.
fuente
AbstractIterator
.yield(i)
se romperá a partir de JDK 13, ya queyield
se agregará como una nueva declaración de Java / palabra clave reservada.Ambos enfoques se pueden hacer un poco más limpios ahora que Java tiene Lambdas. Puedes hacer algo como
Expliqué un poco más aquí.
fuente
Yielderable
? ¿No debería ser asíYieldable
? (el verbo es simplemente 'ceder', no 'ceder' o 'ceder' o lo que sea)yield -> { ... }
se romperá a partir de JDK 13, ya queyield
se agregará como una nueva declaración de Java / palabra clave reservada.Sé que es una pregunta muy antigua aquí, y hay dos formas descritas anteriormente:
yield
que obviamente tiene costos de recursos.Sin embargo, existe otra forma, la tercera y probablemente la más natural, de implementar el
yield
generador en Java que es la implementación más cercana a lo que hacen los compiladores de C # 2.0+ para layield return/break
generación: lombok-pg . Está completamente basado en una máquina de estado y requiere una estrecha cooperaciónjavac
para manipular el código fuente AST. Desafortunadamente, el soporte de lombok-pg parece estar descontinuado (sin actividad de repositorio durante más de un año o dos), y el Proyecto Lombok original lamentablemente carece de layield
función (aunque tiene un mejor IDE como Eclipse, soporte IntelliJ IDEA).fuente
Stream.iterate (seed, seedOperator) .limit (n) .foreach (action) no es lo mismo que el operador de rendimiento, pero puede ser útil escribir sus propios generadores de esta manera:
fuente
También sugiero que si ya está usando RXJava en su proyecto, use un Observable como un "productor". Se puede usar de manera similar si crea su propio Observable.
Los observables se pueden transformar en iteradores, por lo que incluso puede usarlos en bucles for más tradicionales. Además, RXJava te brinda herramientas realmente poderosas, pero si solo necesitas algo simple, quizás esto sea una exageración.
fuente
Acabo de publicar otra solución (con licencia del MIT) aquí , que lanza el productor en un hilo separado y configura una cola limitada entre el productor y el consumidor, lo que permite el almacenamiento en búfer, el control de flujo y la canalización en paralelo entre el productor y el consumidor (por lo que que el consumidor puede estar trabajando en consumir el artículo anterior mientras que el productor está trabajando en producir el siguiente artículo).
Puede utilizar este formulario de clase interna anónima:
por ejemplo:
O puede usar la notación lambda para reducir el texto estándar:
fuente