0
votes

Créez un flux basé sur une méthode génératrice / itérateur personnalisée

Comment puis-je créer un flux qui crée un certain nombre d'éléments basé sur une méthode génératrice personnalisée ()?

La question est différente de celle qui se réfère. Le résultat final est un flux , donc je pouvais (simplistes) utiliser un ".forach (system.out :: println)".

Un exemple serait: flux.generate (myGenerateMethod) .foSeach (System.out :: println) ;

ou un exemple simpliste serait: xxx

mise à jour et solution : renvoyé souvent à des réponses. Flux. Alors la réouverture était meilleure. xxx


5 commentaires

Peu importe. Surprends-moi.


Aussi, celui-ci: Stackoverflow.com/Questtions/22630750/...


Voir aussi Comment les flux s'arrêtent-ils? .


@Andrewtobilko La solution Sclaiterator est exactement la même que celle mentionnée dans la réponse ici sauf moins générique. Donc, omettant de voir pourquoi cela aurait dû être rouvert


Encore une fois, merci beaucoup de m'avoir mentionné dans toutes sortes d'instructions. Par sur simplifiant ma question, on pourrait en conclure que d'autres réponses correspondaient à bien-être. MERCI.


3 Réponses :


1
votes

Vous avez répondu à votre propre question. Votre extrait est exactement comment vous le feriez. Notez que flux.generate (Lambda) code> ne fonctionne que pour les flux sans fin (vous ne pouvez pas marquer que votre flux est terminé), pourquoi le Javadoc de Stream.generate code> commence par Le texte: "Retourne un Infinite Strong> séquentiel ...".

Vous pouvez ensuite utiliser limiter code> pour limiter ceci. Par exemple: P>

class StringGenerator extends AbstractList<String> {
    private final int size;
    public StringGenerator(int size) { this.size = size; }

    public int size() { return size; }
    public String get(int idx) { return "String-" + idx; }
}

...

new StringGenerator(5).stream().forEach(System.out::println);


1 commentaires

flux.generate () crée un flux non ordonné qui a des conséquences sur ce que vous pouvez attendre de limite (...) ou primé quant à compte . Bien que les constructions montrées dans cette réponse fournissent généralement le résultat prévu pour les flux séquentiels, les flux peuvent entraîner de grandes surprises avec des flux parallèles.



1
votes

Le moyen plus fonctionnel d'écrire est le suivant:

IntStream.iterate(0, i -> i < 5, i -> i + 1)
    .mapToObj(i -> "String-" + i)
    .forEach(System.out::println);


4 commentaires

Merci. Le flux.Étathere (I, C, N) est Java 9 et plus. J'ai peur de ne pas pouvoir l'utiliser.


INTREAM.RANGE (0, 5) .Maptoobj (I -> "String-" + i) .poreseach (System.out :: println); n'a pas besoin de Java 9 et est bien plus efficace que itérer .


@Holger " Le problème est que je ne sais pas combien d'articles il y aura. La limite est donc très incertaine. Pour la simplicité, j'ai écrit j'ai besoin de 5 articles "


Il n'y a aucun problème si vous voulez obtenir un résultat incertain, par exemple. Intream.Range (0, ThreadLocalrandom.Current (). Nextint (20)) ... . Sérieusement, il ne sert à rien d'essayer de deviner la signification d'un commentaire désormais supprimé d'allusion à l'existence d'une autre exigence (que le prédicat mis en œuvre via Lambda expression pourrait également être incapable de remplir). L'un ou l'autre, le questionneur dit clairement ce qui est nécessaire ou doit vivre avec des réponses qui n'attaquent que ce qui a été dit (et à cet égard, la question aurait dû être maintenue fermée, car les doublons ont les mêmes réponses que celle-ci).



1
votes

Merci, développeurs !! Vous m'avez inspiré à trouver la solution. Merci beaucoup!

Mon problème était un peu complexe et simplifie laisse à une question trop simplifiée.

Comme nous pouvons lire les nombreuses solutions, elle ressemble à Java et à des flux est amusant à résoudre!

expérimenter avec de nombreuses réponses, celle-ci fonctionne. Il donne une approche assez facile d'obtenir un flux qui peut facilement être contrôlé . Pas de double vérification des critères. J'ai aimé ces réponses Anyxxx () donnant une idée! xxx

merci, contributeurs, encore une fois!


0 commentaires