Taux De Retour En Java
J'ai créé une liste liée dans java à l'aide de médicaments génériques, et maintenant je veux être en mesure de parcourir tous les éléments dans la liste. En C#, je voudrais utiliser yield return
à l'intérieur de la liste liée en allant sur la liste des éléments contenus dans la liste.
Comment pourrais-je aller sur la création d'une version java de ce qui précède où je peux parcourir tous les éléments contenus dans la liste chaînée?
Je suis à la recherche pour être en mesure d'écrire du code ala
LinkedList<something> authors = new LinkedList<something>();
for (Iterator<something> i = authors.Values ; i.HasNext())
doSomethingWith(i.Value);
Et a été de penser que la Valeur des "biens", de méthode, du code ressemblant à
LinkedListObject<something> current = first;
While (current != null){
yield return current.getValue();
current = current.getNext()
}
Edit: Notez que je ne suis pas intéressé à l'aide d'un 3ème partie Api. Built-in fonctionnalité java uniquement.
- stackoverflow.com/questions/1980953/...
- je ne sais pas C#. Curieux, ce n'taux de retour n'?
- vérifiez ceci: msdn.microsoft.com/en-us/library/9k7k7cf0(SV.80).aspx
- Merci de le lire. Qui semble trop compilateur (langage de programmation), centrée sur le moi. En java, c'est dur mais réalisable.
- trop compilateur centric? Si j'imagine que j'aurais du programme moi-même toutes les choses que le compilateur de programmes pour moi...
- À l'aide de taux de retour, avec cet exemple fournit pas de valeur réelle. Il vous suffit de retourner la liste liée comme
IEnumerable<something>
.yield return
seulement fournit de la valeur lorsque vous avez un générateur de fonction immédiatement les rendements les valeurs plutôt que de les pousser à un conteneur. - ou lorsque le calcul (générateur de fonction) est coûteuse et paresseux-évaluation est nécessaire.
- C'est juste une reformulation de ce que j'ai dit. Si la liste est déjà entièrement construit à la mémoire, il n'était pas "paresseux évalué". Si la fonction "poussé à un conteneur" comme je l'ai dit, et comme décrit dans le cas des OP question, les résultats étaient très évalués.
- Connexes: stackoverflow.com/q/11570132
Vous devez vous connecter pour publier un commentaire.
Suis-je manqué quelque chose? Il y a déjà de java.util.LinkedList, il est entièrement génériques-activé, et il a une méthode qui renvoie un Itérateur.
Si vous voulez vraiment ré-inventer la roue, je vous suggère de regarder dans la création d'un LinkedListIterator classe, probablement la mise en œuvre de ListIterator. Il serait de se souvenir de sa position actuelle au sein de la liste, et l'avance sur chaque appel successif.
yield return
en C#/.Net ne fait que créer un itérateur. Si le consommateur de la variable d'itération se termine au début, puis ne sorte de la boucle qui génère de l'itération. Une infinie générateur est un exemple de quelque chose qui n'est pas possible sans un itérateur qui n'utilise pas de collection comme une étape intermédiaire. Pour l'exemple qu'ils ont donné, bien entendu, vous juste retour de l'itérateur deLinkedList
.Vous pouvez nous retourner un anonyme de la mise en œuvre de Itératif. Les effets sont assez assez similaire, c'est juste que c'est beaucoup plus détaillé.
"taux de retour" est un très sophistiqué compilateur truc. Essentiellement, il vous permet de mettre en œuvre de manière déclarative IEnumerable sans les détails ennuyeux de "comprendre" comment construire votre itérateur. Le malheureux, c'est qu'il ne permet pas de traduire dans d'autres langues bien parce que très peu de compilateurs ont de telles capacités. À certains égards, "taux de retour" est tout aussi accablant que révolutionnaire.
Essentiellement en C#, le compilateur va générer deux implémentations de l'interface IEnumerable et IEnumerator (de T). Il le fait par essentiellement de la réalisation de votre "méthode"'s variables locales comme des champs d'instance généré la mise en œuvre des classes ainsi qu'à l'examen des cadres qui contiennent un "taux de retour" de l'artefact. Une fois que vous savez cela, il devrait être possible pour un bien arrondi développeur pour accomplir la même chose explicitement... mais pas de façon aussi concise. Pour le démontrer, je vais CONCAT!
Si vous pardonnera mes 3H du matin pseudo java...
essayer cette
vérifier cet article pour un exemple de mise en œuvre ainsi:
Productrice
Je ne comprends pas pourquoi les gens parlent de threads... est-il quelque chose que je ne sais pas sur les taux de retour?
À ma compréhension taux de retour sauve juste la méthode de la pile et les restaure à une date ultérieure. Pour mettre en œuvre des taux de retour, vous avez juste à enregistrer l'état manuellement. Voir la Java itérateur des classes pour plus de détails, mais pour une liste, vous pouvez simplement obtenir loin avec la sauvegarde de l'élément actuel. Pour un tableau vous avais juste besoin de l'index.
Juste pour aider les lecteurs à comprendre les petits détails.
Si vous créez une nouvelle liste contenant tous les éléments résultant et retourner la liste, alors c'est une bonne mise en œuvre, assez simple à coder. Vous pouvez avoir aussi intéressant structure de données que vous avez besoin, et lors de la numérisation pour les bonnes entrées, il suffit de retourner une liste de tous les matchs, et votre client va itérer sur la liste.
Si vous souhaitez enregistrer un état, il peut être plus compliqué. Vous aurez besoin pour obtenir à l'endroit où vous avez été à chaque fois que votre fonction est appelée. Ne pas oublier de ré-entrant, etc.
La solution avec les threads ne pas créer une nouvelle liste. Et c'est aussi simple que la première solution. Le seul problème est que vous impliquent une synchronisation de thread qui est un peu plus dur à coder, et a ses performances.
Donc, oui, le taux de retour est très bien et est manquant à partir de Java. Pourtant, il existe des solutions de contournement.
J'ai essayé de comprendre ce que le rendement n'mais sans le C# expérience, je ne suis pas sûr si je l'ai, mais je vais essayer quand même...
Je suggère ce qui suit...
Quand il s'agit de retourner les valeurs à partir d'une méthode que je ferais la suite...
Ai-je perdu du terrain?
Si vous voulez l'ensemble des fonctionnalités de
yield return
, vous avez probablement besoin de mettre en place cela dans deux threads, une pour la première méthode, et celle de la seconde. Alors que le premier thread doitwait
jusqu'à ce que le deuxième thread met sa valeur quelque part accessible etnotify
s il qu'il est prêt. Alors que le premier thread pour traiter cette valeur,wait
pour la prochaine valeur, etc.utiliser ma bibliothèque java pour réaliser des taux de retour sans l'aide de threads ou de byte code manipulation
http://www.heinerkuecker.de/YieldReturnForNested.html