Java 8 Itératif.forEach() vs boucle foreach

- Ce qui est le mieux la pratique en Java 8?

Java 8:

joins.forEach(join -> mIrc.join(mSession, join));

Java 7:

for (String join : joins) {
    mIrc.join(mSession, join);
}

J'ai beaucoup de boucles for qui pourrait être "simplifié" avec des lambdas, mais est-il vraiment parti de leur utilisation? Serait-il améliorer leurs performances et la lisibilité?

MODIFIER

Je vais aussi étendre cette question à plus de méthodes. Je sais que vous ne pouvez pas retourner ou de rompre avec la fonction parent d'un lambda, et cela devrait également être pris en considération lors de la comparaison, mais est-il autre chose à être pris en compte?

  • Je crois lamdas sont destinés à améliorer l'utilisation de processeurs multi-core. Si votre environnement cible est multi-core, je crois lamdas aura amélioration de la performance sur le java 7 pour la boucle.
  • Il n'y a pas de réel avantage en termes de performance de l'un sur l'autre. La première option est quelque chose inspiré par FP (qui est couramment parlé comme plus "agréable" et "effacer" pour exprimer votre code). En réalité c'est plutôt le "style" de la question.
  • dans ce cas, ce n'est pas pertinente. forEach n'est pas défini comme étant parallèles ou quoi que ce soit, de sorte que ces deux choses sont sémantiquement équivalents. Bien sûr, il est possible de mettre en œuvre une version parallèle de forEach (et on peut déjà être présents dans la bibliothèque standard), et dans un tel cas, la syntaxe de l'expression lambda serait très utile.
  • L'instance sur laquelle forEach est appelé est un Flux (lambdadoc.net/api/java/util/stream/Stream.html). Pour demander une exécution parallèle on pourrait écrire des jointures.parallèle().forEach(...)
  • Est joins.forEach((join) -> mIrc.join(mSession, join)); vraiment une "simplification" de for (String join : joins) { mIrc.join(mSession, join); }? Vous avez augmenté la ponctuation compter de 9 à 12, pour le bénéfice de cacher le type de join. Ce que vous avez vraiment à faire est de mettre deux états sur une seule ligne.
  • La parenthèse n'est pas nécessaire sur le côté gauche de la lambda. De la sorte, peut être écrite comme: les jointures.forEach( join -> mIrc.join(mSession,l'adhésion);
  • Question connexe: stackoverflow.com/questions/23218874/...
  • Un autre point à considérer est le peu variable de capture de Java. Avec Stream.forEach(), vous ne pouvez pas mettre à jour les variables locales depuis leur capture rend finale, ce qui signifie que vous pouvez avoir avec un état de comportement dans le forEach lambda (sauf si vous êtes prêt pour une certaine laideur comme l'utilisation de la classe de variables d'état).
  • dépend du cas d'utilisation.
  • si vous avez besoin de la programmation parallèle activée, puis utiliser les flux d'autres sages simplement utiliser le trivial approche.
  • La mise en œuvre du Parallélisme sans la nécessité comprendra excessive des frais généraux.

InformationsquelleAutor nebkat | 2013-05-19