Les deux options que je connais sont la bibliothèque infomancers-collections de Aviad Ben Dov datant de 2007 et la bibliothèque YieldAdapter de Jim Blackler datant de 2008 (qui est également mentionnée dans l'autre réponse).
Les deux vous permettront d'écrire du code avec une construction similaire à yield return
en Java, donc les deux satisferont votre demande. Les différences notables entre les deux sont :
Mécanismes
La bibliothèque de Aviad utilise la manipulation des octets tandis que celle de Jim utilise le multithreading. Selon vos besoins, chacune peut avoir ses propres avantages et inconvénients. Il est probable que la solution de Aviad soit plus rapide, tandis que celle de Jim est plus portable (par exemple, je ne pense pas que la bibliothèque de Aviad fonctionnera sur Android).
Interface
La bibliothèque de Aviad a une interface plus propre - voici un exemple :
Iterable it = new Yielder() {
@Override protected void yieldNextCore() {
for (int i = 0; i < 10; i++) {
yieldReturn(i);
if (i == 5) yieldBreak();
}
}
};
Alors que celle de Jim est beaucoup plus compliquée, vous obligeant à adept
un Collector
générique qui a une méthode collect(ResultHandler)
... ugh. Cependant, vous pourriez utiliser quelque chose comme ce wrapper autour du code de Jim par Zoom Information qui simplifie grandement cela :
Iterable it = new Generator() {
@Override protected void run() {
for (int i = 0; i < 10; i++) {
yield(i);
if (i == 5) return;
}
}
};
Licence
La solution de Aviad est sous licence BSD.
La solution de Jim est dans le domaine public, tout comme son wrapper mentionné ci-dessus.
6 votes
Je sais, je sais. Mais je pense que savoir plus de langues, c'est plus de puissance. De plus, le développement backend (que je fais) dans l'entreprise pour laquelle je travaille actuellement est fait en Java, donc je ne peux pas vraiment choisir le langage :(