Partage
  • Partager sur Facebook
  • Partager sur Twitter

Lambda Expression - Multiplication de tableaux

    27 novembre 2015 à 10:43:56

    Salut a tous,

    Pour un projet j'aimerais comparer la rapidité d'une expression lambda et du code que j'ai actuellement. Je cherche a multiplier chaque terme de deux tableaux entre eux, et d'en récupérer la somme.

    Pour le moment j'ai donc cela :

    double sum = 0;
    t1[],t2[]
    for(int i = 0 ; i < t1.length ; i++){
     sum += t1[i]*t2[i]
    }

    Que j'aimerais bien passer en expression lambda...

    Avec quelques recherche j'ai Arrays.asList(t1,t2).foreach(fait qqch) sauf que je n'arrive pas a l'utiliser (les exemples trouvés n'utilise que System.out.print). Ainsi que Arrays.stream(t).sum() pour sommer un tableau.

    Merci d'avance pour votre aide =D

    -
    Edité par BabC 27 novembre 2015 à 10:44:39

    • Partager sur Facebook
    • Partager sur Twitter
      27 novembre 2015 à 11:24:08

      Bonjour.

      Les lambda sont "juste" une simplification d'une classe anonyme.
      Ici tu n'as pas de classe anonyme, donc ça va être compliqué de partir de ton programmer pour en introduire les lambda.

      C'est surement l'API Collection (aussi une nouveauté de Java 8) que tu désires, avec l'utilisation de Stream.

      Par contre les Stream se comportent comme les foreach.
      Or tu ne peux pas faire de foreach simultané sur tes 2 collections en même temps comme ceci :

      for (int [i, j] : [tab1, tab2])
      	sum = i * j

      (sauf si tu le fais sur 1 tableau, et que tu utilises un compteur pour accéder à l'élément du 2nd tableau, mais ça perdrait l'intérêt de le faire en 1 ligne)

      Une solution serait d'implémenter ta propre méthode permettant de générer un itérateur sur une paire d'éléments et l'utiliser ainsi :
      (à voir si cette solution existe déjà)

      for (Pair<int, int> pair : doubleIteration(tab1, tab2) {
          int i = pair.First();
          int j = pair.Second();
          sum = i*j;
      }

      Et cette solution pourrait être utilisé pour passer par au Stream !

      Pour utiliser un Stream directement sur 2 collections, la solution est de commencer ton foreach sur les indices :

      // map
      int[] tab3 = ...;
      for (int i=0; i<tab1.length; i++)
          tab3[i] = tab1[i]*tab2[i];
      // reduce
      int accu = 0;
      for (int i=0; i<tab3.length; i++)
          accu = accu + tab3[i];

      Astuce : modéliser les différentes opérations de mapping/réduction/filtrage afin de construire plus facilement le Stream.

      Résultat :

      IntStream.range(0, tab1.length).map(i -> tab1[i] * tab2[i]).sum()
      • Partager sur Facebook
      • Partager sur Twitter
      Angular 2 est l'avenir, jQuery c'est de la merde !!! - Java 8 c'est l'an 2016+ (programmez en 1 ligne)

      Lambda Expression - Multiplication de tableaux

      × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
      × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
      • Editeur
      • Markdown