En Java, quels sont les avantages de flux de boucles?
M'a demandé lors d'une interview et je ne suis pas convaincu, j'ai donné la meilleure réponse que je pouvais avoir. J'ai mentionné que vous pouvez faire une recherche parallèle et que les valeurs nulles ont été traitées par certains moyens, je ne pouvais pas me souvenir. Maintenant, je réalise que je pensais des Options. Ce qui me manque ici? Ils prétendent que c'est mieux ou plus concise code, mais je ne suis pas sûr que je suis d'accord.
Considérant comment, de façon succincte, il a été répondu, il me semble que ce n'était pas trop large une question après tout.
Si ils se posent cette question lors de l'entrevue, et il est clair qu'ils sont, ce que l'on pourrait décomposer servir qu'à rendre plus difficile de trouver une réponse? Je veux dire, que recherchez-vous? Je pouvais briser la question et ont toutes les sous-questions répondu, mais ensuite, créez un parent en question avec des liens à tous les subquestions... semble assez ridicule mais. Tant que nous y sommes, s'il vous plaît me donner un exemple d'une moins vaste question. Je ne connais aucun moyen de demander à une partie seulement de cette question et obtenir une réponse significative. J'ai pu poser exactement la même question d'une manière différente. Par exemple, je pourrais poser la question "Quel est le but des flux servir?" ou "Quand dois-je utiliser un jet au lieu d'une boucle for?" ou "Pourquoi s'embêter avec des cours d'eau au lieu de boucles for?" Ce sont tous exactement la même question.
...ou est-ce considéré comme trop large parce que quelqu'un a donné un très long multi-point de réponse? Franchement quelqu'un dans le savoir pouvait le faire avec presque n'importe quelle question. Si vous arrive d'être l'un des auteurs de la JVM, par exemple, vous pourriez probablement parler pour les boucles tout au long de la journée, quand la plupart d'entre nous ne le pouvait pas.
"Veuillez modifier la question de la limiter à un problème spécifique avec suffisamment de détails pour identifier une réponse adéquate. Éviter de poser plusieurs questions à la fois. Voir la Comment Poser une page pour aider à clarifier cette question."
Comme indiqué ci-dessous, une réponse adéquate a été donné, ce qui prouve qu'il est un et qu'il est assez facile à fournir.
- C'est à mon humble avis, opinion. Personnellement, je préfère les flux car elle rend le code plus lisible. Il permet d'écrire ce que vous voulez au lieu de comment. En outre, il est totalement badass à faire des choses étonnantes avec des one-liners.
- Même si c'est un 30 ligne, un liner? Je ne suis pas fan des longues chaînes.
- D'ailleurs, tout ce que je cherche ici est la réponse appropriée pour une entrevue. C'est le seul avis qui compte.
- Je suis d'accord sur le badass chose, mais si nous parlons de tests de performance, dont l'un serait plus optimal ?
- la performance pourrait ne pas être une priorité.
- Pédagogiquement parlant, cette question m'a sauvé quelques dégradation lors d'un futur entretien trop, @slim vraiment réussi, mais Industriellement parlant, il parle aussi de la façon dont Microsoft langages de programmation construit leur carrière sur l'extraction hors du langage java, et enfin java, il obtient sa revanche en l'arrachant la Lambda Expression et de flux de l'adversaire, permet de voir ce que java va faire sur les Structures et les Syndicats dans le futur 🙂
- Notez que les flux d'exploiter une fraction de la puissance de la programmation fonctionnelle :-/
- nous allons voir que, si/lorsque Java devient réelle de l'inférence de type à moitié aussi bon que Roslyn est.
- Je ne pense pas que je peux vraiment faire une réponse hors de cela, du moins pas pour cette question, mais les flux interne et l'itération, donc ils n'ont pas à utiliser une boucle. Les gens sont prompts à souligner le parallélisme, mais des cours d'eau peut également être mis en œuvre avec la récursivité qui est très utile pour, par exemple, l'arbre transversal.
- Mug , j'ai strictement signifie pas une infraction à la la belle et la bête en c# d'affaires, essayant juste de faire remarquer que java est encore manque le bête, peut-être un jour viendra où java obtient son type de référence de la moitié aussi bon que le c#, parce que je peux certainement imaginer qu'ils travaillent sur le manque moitiés 🙂
Vous devez vous connecter pour publier un commentaire.
Intéressant de noter que la question de l'entrevue pose des questions sur les avantages, sans lui demander à propos des inconvénients, car il y en a deux.
, Les ruisseaux sont un plus déclaratif style. Ou plus expressive style. Elle peut être considérée comme préférable de déclarer votre intention dans le code, que de décrire comment c'est fait:
... dit très clairement que vous êtes le filtrage des éléments correspondants à partir d'une liste, considérant ce qui suit:
Dit "je suis en train de faire une boucle". Le but de la boucle est enterré profondément dans la logique.
Les ruisseaux sont souvent terser. Le même exemple montre. Terser n'est pas toujours le meilleur, mais si vous pouvez être concis et expressif dans le même temps, tant mieux.
Flux ont une forte affinité avec les fonctions. Java 8 introduit des lambdas et des interfaces fonctionnelles, ce qui ouvre la voie coffre à jouets de techniques puissantes. Les cours d'eau fournissent le plus pratique et naturelle pour appliquer des fonctions à des séquences d'objets.
Flux encourager moins de mutabilité. C'est en quelque sorte liée à la programmation fonctionnelle aspect -- le genre de programmes que vous écrivez à l'aide de flux ont tendance à être le genre de programmes où vous n'avez pas à modifier des objets.
Flux d'encourager un couplage lâche. Votre flux de code de traitement n'a pas besoin de connaître la source de la rivière, ou son éventuelle résiliation de la méthode.
Des cours d'eau peut succinctement exprimer assez sophistiqué comportement. Par exemple:
Peut paraître au premier coup d'œil, comme si elle filtre l'ensemble des flux, puis renvoie le premier élément. Mais en fait
findFirst()
lecteurs de l'ensemble de l'opération, de sorte qu'il efficacement s'arrête après la découverte d'un élément.Ruisseaux offrent la possibilité pour les futurs gains d'efficacité. Certaines personnes ont comparé et a constaté que single-threaded flux en mémoire
List
s ou les tableaux peuvent être plus lent que l'équivalent de la boucle. C'est plausible car il y a plus d'objets et des frais généraux dans le jeu.Mais les rivières à l'échelle. Ainsi que Java est intégré dans l'appui à courant parallèle des opérations, il y a un peu de bibliothèques pour la distribution de réduire la carte à l'aide de cours d'eau comme l'API, parce que le modèle s'adapte.
Inconvénients?
Performance: Un
for
parcourir un tableau est extrêmement léger, à la fois en termes de mémoire et de PROCESSEUR. Si la vitesse brute de mémoire et de sens de l'économie est une priorité, à l'aide d'un flux, c'est pire.Familiarité.Le monde est plein de vécu de procédure programmeurs, de la langue de nombreux milieux, pour lesquels les boucles sont familiers et les ruisseaux sont nouveaux. Dans certains environnements, vous voulez écrire du code qui vous est familier de ce genre de personne.
Cognitifs généraux. En raison de son caractère déclaratif, et l'augmentation de l'abstraction de ce qui se passe en dessous, vous aurez besoin de construire un nouveau modèle mental de la façon dont le code se rapporte à l'exécution. En fait, vous avez seulement besoin de le faire quand les choses vont mal, ou si vous avez besoin de profondément d'analyser la performance ou de bogues. Quand il "fonctionne", il fonctionne, tout simplement.
Débogueurs sont à améliorer, mais même maintenant, quand vous faites un pas par le biais de flux de code dans un débogueur, il peut être beaucoup plus dur que l'équivalent de la boucle, parce que d'une simple boucle est très proche pour les variables et le code des endroits qu'un débogueur traditionnel travaille avec.
stream().filter
qui peut être fait en utilisant une seule boucle for. Qui sera considéré comme un inconvénient?.filter(predicate1.and(predicate2))
ou.filter(predicate1).filter(predicate2)
. Je voudrais utiliser ce dernier. Je ne vois pas pourquoi le faire au sein d'une boucle est préférable. Pourquoi avez-vous?Syntaxique plaisir à côté, les Ruisseaux sont conçus pour fonctionner avec potentiellement infiniment grands ensembles de données, tandis que les tableaux, les Collections, et de presque toutes les Java SE classe qui implémente l'objet iterable sont entièrement en mémoire.
Un inconvénient d'un Ruisseau, c'est que les filtres, les mappages, etc., ne peut pas jeter checked exceptions. Ce qui fait un Stream un mauvais choix pour, disons, intermédiaire en opérations d'e/S.
Stream<Row>
-- ou il serait possible d'écrire leur propreStream
la mise en œuvre d'emballage DB résultat des opérations de curseur.Vous avez réalisé de façon incorrecte: en parallèle, l'utilisation
Stream
s, pasOptional
s.Vous pouvez définir des méthodes de travail avec des cours d'eau: en prenant comme paramètres, retour, etc. Vous ne pouvez pas définir une méthode qui prend en boucle comme un paramètre. Cela permet à un complexe de flux opération une fois et l'utiliser à de nombreuses reprises. Notez que Java a un inconvénient: vos méthodes pu être appelé comme
someMethod(stream)
par opposition aux flux proprestream.someMethod()
, afin de les mélanger complique la lecture: essayez de voir l'ordre des opérations dansDe nombreux autres langages (C#, Kotlin, Scala, etc) permettent une certaine forme de "méthodes d'extension".
Même quand vous avez seulement besoin des opérations séquentielles, et vous ne voulez pas de les réutiliser, de sorte que vous pouvez utiliser soit des ruisseaux ou des boucles, des opérations simples sur les cours d'eau peuvent correspondre à bien des changements complexes dans les boucles.
Optional
est une alternative ànull
, mais elle n'a rien à voir avec les opérations en parallèle. Sauf si "Maintenant, je me rends compte que je pensais des Options" dans votre question est seulement de parler denull
la manipulation?Vous passer en boucle une séquence (tableau, de collecte, de saisie, ...) parce que vous voulez appliquer une fonction aux éléments de la séquence.
Flux de vous donner la possibilité de composer fonctions sur les éléments de la séquence et de permettre à mettre en œuvre la plupart des fonctions communes (par exemple, la cartographie, de filtrage, de recherche, de tri, de collecte, ...) indépendamment d'un cas concret.
Par conséquent, compte tenu de certains boucle tâche dans la plupart des cas, vous pouvez l'exprimer avec moins de code à l'aide de Flux, c'est à dire vous gagnez lisibilité.
Je dirais que son parallélisation qui est si facile à utiliser. Essayez de parcourir des millions d'entrées en parallèle avec une boucle for. Nous allons à de nombreux processeurs, pas plus vite, donc plus il est facile de s'exécuter en parallèle le mieux, et avec
Stream
s c'est un jeu d'enfant.Ce que j'aime beaucoup est la verbosité qu'ils offrent. Il faut peu de temps pour comprendre ce qu'ils font et de produire plutôt que de comment ils le font.