Le Touilleur Express

  • Accueil
  • A propos de l’auteur
  • A propos du Touilleur Express

Le gars qui connaît Scala et celui qui débute

8 décembre, 2011

Tag image Scala
Un peu de Scala vite fait pour faire chauffer le CPU :

Soit un numéro IBAN simple, présenté sous la forme d’une grosse chaîne de caractère :
FR7630057410821012122045021

Comment l’afficher à l’écran en le formatant de cette façon ?

FR76 3005 7410 8210 1212 2045 021

Voici un premier bout de code écrit en juillet dernier par votre serviteur :

val iban="FR7630057410821012122045021"

iban.zipWithIndex.map{p=>p match{case(t,idx) if (idx+1)%4==0=>{print(t+" ")} ; case(t,idx)=>{print(t)}}}

// si, si ça marche

Et voici le même code après avoir lu la doc et aussi après avoir vu un email sur la liste du Scala User Group :



for(p < - iban.sliding(4,4).toList){ print(p+" ")}


Conclusion : lisez la documentation avant de vous lancer dans des "expérimentations" pour dire ensuite "dans skala' c'est compliqué".

Articles similaires:

Default ThumbnailLes Closures enfin expliquées par un gars qui n'y connaît rien Default ThumbnailPrésentation de Play! Scala au Scala User Group Default ThumbnailLancement du Paris Scala User Group Default ThumbnailScala, case, Option, None et Some
  • Al 8 décembre 2011 at 11 h 40 min

    Sinon tu peux aussi faire 😉
    iban.sliding(4,4).map( _+ " " ).foreach( print )

  • Benjamin Lerman 8 décembre 2011 at 11 h 41 min

    Le meme sans l’espace a la fin:

    println(iban.sliding(4,4).reduceRight(_+" "+_))

  • Al 8 décembre 2011 at 11 h 46 min

    Ok alors tant qu’a faire
    print( iban.sliding(4,4).mkString( " " ) )
    Il n’y a pas a dire, le code review ca paie 🙂

  • Olivier Hubaut 8 décembre 2011 at 11 h 48 min

    Encore plus simple:
    print(iban.sliding(4,4).mkString( » « ))

  • Olivier Hubaut 8 décembre 2011 at 11 h 49 min

    Damn, grille le temps de lire l’article…

  • Olivier Croisier 8 décembre 2011 at 11 h 51 min

    Et le gars qui connaît Guava :
    System.out.println( Joiner.on(\' \').join( Splitter.fixedLength(4).split(\"FR7630057410821012122045021\")) );

    Et un développeur, même junior, n\’a pas besoin de 6 mois de formation pour arriver à écrire ce code.
    Moi je dis ça…

  • Nicolas Martignole 8 décembre 2011 at 11 h 53 min

    Ouep, pas bête de montrer aussi la version Java.

    Et en Groovy ? Là je suis pas chaud mais ça doit être facile je pense

  • Loic 8 décembre 2011 at 12 h 07 min

    Intéressant! En scala on peut toujours faire des choses simples, et très jolies (très expressives quoi).
    Le seul danger c’est surement que des mecs un peu « chauds » nous pondent des API beaucoup plus tordus pour profiter de toutes les subtilités du langage…

    @Nicolas A ce propos que penses tu de l’API Anorm de Play? Pour une fois je vais critiquer Play (version Scala), je la trouve hyper compliquée avec tout ses « hiéroglyphes » dès qu’on veut faire un truc un peu poussé…

  • Nicolas Martignole 8 décembre 2011 at 12 h 27 min

    @Loic la version actuelle d’Anorm avec les parsers combinators est puissante, mais trop compliquée. Ils travaillent sur une version plus simple pour Play 2.0. Moi je m’y suis habitué, j’ai bossé 5 mois avec et c’est facile. Il faut apprendre le principe des « parser combinators » mais rien de méchant. Il faudrait que je fasse un article sur ce sujet car c’est très riche.

  • Guillaume Saint-Raymond 8 décembre 2011 at 13 h 42 min

    La version en Groovy mais ce n’est pas la plus évidente :
    iban.split("(?<=\\G.{4})").join(" ")

  • Loic 8 décembre 2011 at 13 h 49 min

    Cool c’est une super nouvelle qu’ils simplifient un peu ça!
    Un article sur ce sujet serait très intéressant en tout cas.

  • Fabian Piau 8 décembre 2011 at 14 h 06 min

    En tout cas, je salue le jeu de mot à la fin… si jeu de mot il y a bien… 😉

  • Sébastien Blanc 8 décembre 2011 at 14 h 36 min

    Une autre variante Groovy mais pas non plus vraiment la plus claire 🙂 (et nécessite une deuxieme variable (output))

    iban.eachMatch(/.{4}/){output=output+ »${it} « }

  • Sébastien Blanc 8 décembre 2011 at 14 h 38 min

    Avec les balises code, c’est mieux
    iban.eachMatch(/.{4}/) {output=output+"${it} "}

  • kawas 8 décembre 2011 at 15 h 28 min

    Pareil en clojure,
    on écrit du code les 1ères semaines et 3 mois plus tard on se rend compte que l’on était un vrai novice 🙂

    (->> "FR7630057410821012122045021" (partition-all 4) (interpose " ") (flatten) (apply str))

  • Matthieu Guillermin 8 décembre 2011 at 16 h 28 min

    Et voilà pour PHP :

    echo implode(" ",str_split($iban,4));

  • Aurélien Pelletier 8 décembre 2011 at 16 h 39 min

    On va oublier la première version de Nicolas, mais ça nous laisse quand même

    1 for(p < - iban.sliding(4,4).toList){ print(p+" ")} 2 iban.sliding(4,4).map( _+ " " ).foreach( print ) 3 println(iban.sliding(4,4).reduceRight(_+" "+_)) 4 print( iban.sliding(4,4).mkString( " " ) )

    4 manières différentes d'exprimer la même chose dans le même langage, ça doit pas aider pour travailler en équipe ou maintenir le code.

    Je me demande si c'est parce que les librairies de scala sont mal pensées, ou si le problème vient du paradigme fonctionnel ?

  • joseph 8 décembre 2011 at 16 h 46 min

    Et que tout ceux qui voudraient en conclure que scala c\’est compliqué se demandent d\’abord s\’il y a une façon unique de faire une telle chose dans leur langage de prédilection… Et combien même, je ne suis pas certain que cela serait une bonne chose!

    ++

  • Aurélien Pelletier 8 décembre 2011 at 16 h 57 min

    « There is more than one way to do it » c’est le moto de perl un langage qui n’est pas réputé pour sa lisibilité ou sa maintenabilité.

    « There’s Only One Way To Do It » c’est le moto de python un langage qui a quand même meilleure réputation.

    Maintenant chacun est libre d’en conclure ce qu’il veut à propos de scala.

  • Bruno 8 décembre 2011 at 17 h 01 min

    Pour Guava, il faut avoir eu connaissance de cette librairie parmi Apache-Commons et autres, savoir l’integrer, connaitre les API quelle propose …
    De plus Splitter ne fonctionne que pour les String (ou charSequence) alors que :A](Int,Int):GroupedIterator[B] »>sliding fonctionnera sur tout Iterator et pourra donc resservir.

    Je connaissais déjà la fonction sliding pour l’avoir utilisé sur des Lists.

  • blouerat 8 décembre 2011 at 19 h 19 min

    Il y aura un espace en trop à la fin dans les différentes versions proposées. Et d’un point de vu purement on fonctionnel, le mieux c’est de générer la string finale, puis de l’afficher (effets de bord…). Du coup j’aurais une préférence pour un :
    println(iban.sliding(4,4).mkString("", " ", ""))

  • Alexis Agahi 8 décembre 2011 at 20 h 09 min

    C’est fou ca, à chaque fois qu’on parle de Scala, on en arrive au vieux debat du « mon langage pisse plus loin que le tiens ». Il va falloir inventer une variante de la loi Godwin pour les langages…

  • Sébastien Blanc 8 décembre 2011 at 21 h 20 min

    @Alexis A part Aurelien qui trolle un peu, chacun a juste exposé de manière sympathique et ludique la version de chaque language. J’ai trouvé ca très intéressant et je pense que personne ne voulait pisser le plus loin, ca serait bien triste sinon et pas digne d’un dev 😉

  • Guillaume Laforge 9 décembre 2011 at 0 h 31 min

    Pour la version Groovy, mon premier réfléxe était un simple coup de replaceAll :
    def iban = "FR7630057410821012122045021" println iban.replaceAll('(.{4})', '$1 ')
    Il n’y a pas d’espace à la fin comme dans certaines de ces solutions, et surtout… ben replaceAll c’est une méthode de java.lang.String 🙂

  • Fabrice Croiseaux 9 décembre 2011 at 7 h 03 min

    Pourquoi ne pas utiliser .grouped(4) au lieu de .sliding(4,4), je crois que c’est fait pour ça. Ce qui donne
    print(iban.grouped(4).mkString(" ")

  • Aurélien Pelletier 9 décembre 2011 at 7 h 46 min

    et hop une 5eme variante !

    @guillaume tu triches, tu connais les expressions régulière 😉 http://xkcd.com/208/

  • Alexis Agahi 9 décembre 2011 at 8 h 45 min

    @Fabrice Croiseaux bien vu ! et visiblement c’est le meme code en dessous

    def grouped[B >: A](size: Int): GroupedIterator[B] = new GroupedIterator[B](self, size, size)

    et

    def sliding[B >: A](size: Int, step: Int = 1): GroupedIterator[B] = new GroupedIterator[B](self, size, step)

  • Loic 9 décembre 2011 at 8 h 59 min

    La version la plus lisible serait pour moi au final

    for(p < – iban.grouped(4).toList){ print(p+" ")}
    ou
    iban.grouped(4).map( _+ " " ).foreach( print )

    @Aurélien Pelletier je connais pas bien python mais en tout cas que je soit Java ou Groovy il n'y a pas une unique façon de faire cette opération…
    Du moment que tu as des API riches sur la manipulation des chaines et des collections tu trouveras toujours plusieurs moyens de faire ce genre de choses

  • Brice 9 décembre 2011 at 10 h 12 min

    @Aurelien Enfin quand même en Java tu peux aussi écrire ce code différemment, les débutants ne connaissent même pas tous les features de Java standard, alors qund tu ajoutes les commons-collection et guava tu te retrouves avec du code très varie, donc il y a exactement le même problème d’homogénéité dans l’écosystème.

    Ce qui est important ce n’est pas la concision du code, c’est sa lisibilité et sa maintenabilité. En Java comme en Scala comme pour tous les langages, et ça franchement c’est aussi le boulot du développeur. Si c’est un newbie, qui sort de l’école et qui n’a fait que des projets jetables, il faut l’amener a ces considérations.

  • Olivier Croisier 9 décembre 2011 at 15 h 41 min

    Ben justement, des trucs qui s’appellent Splitter et Joiner me paraissent plus explicites qu’une méthode « sliding ». Toutes considérations de langages mises à part.

    Sinon j’aime bien la version de Guillaume aussi 🙂

  • Lorber Sebastien 10 décembre 2011 at 2 h 18 min

    Apres avec du Java/Guava on peut aussi splitter la list en sous listes de 4 elements:
    Iterables.partition( iban.toCharArray() , 4 );

    Au final tous les langages permettent de faire a peu près la même chose sauf que forcement les nouveaux langages s’inspirent du passé et proposent plus de choses nativement… Y a qu’a voir toutes ces librairies java (dont apache commons) qui n’utilisent toujours pas les generics…

    Au final rien ne vous empêche de contribuer sur les libs Java 😀

  • Olivier Croisier 20 décembre 2011 at 11 h 35 min

    Et en Haskell :

    byFour :: [Char] -> [Char]
    byFour (a:b:c:d:xs) = [a,b,c,d,’ ‘] ++ byFour xs
    byFour x = x

    Je trouve ça plus lisible que la version Scala :
    for(p < – iban.sliding(4,4).toList){ print(p+" ")}

  • fredb 20 décembre 2011 at 12 h 10 min

    Le but de l’exercice c’est de résoudre le problème avec les primitives du langage, ou, à la limite, les quelques classes de base. A priori, sortir une librairie externe, que ce soit guava ou apache commons, ça sort un peu des clous.
    +1 à la version regexp + groovy 😉

  • Nicolas L. 20 décembre 2011 at 13 h 05 min

    @fredb : le jour ou l’iban est sur un multiple de 4, la solution Groovy générera un bug 🙂

    A propos de la conclusion de l’article c’est évident qu’il faut lire la documentation, et cette conclusion pourrait être faite pour n’importe quel langage.

  • Gabriel 27 décembre 2011 at 16 h 27 min

    fun([A, B, C, D|Rest)->[A, B, C, D, $\s|fun(Rest)];
    fun(Rest)->Rest;
    Comme en Haskell, quoi 🙂

    Ou bien :
    I= »FR7630057410821012122045021″.
    lists:reverse ( lists:foldl(fun(Char, Acc)->
    case length(Acc) rem 5 of
    4 -> [Char, $\s|Acc];
    _ -> [Char|Acc]
    end
    end, [], I)).

    La fonction rem :reste de la division..
    On accumule tous les caractères, tous les 4 on rajoute un \s (qui veut dire universellement « espaaace »)
    Et une fois la chaîne de caractères obtenue par accumulation en tête de la liste, on retourne cette liste (lists:reverse).
    Je crois que c’est clair 😀

  • Patrick Bernard 23 janvier 2012 at 21 h 53 min

    C’est gentil toutes ces variantes…
    Mais elles nous font combien de cycles horloge?

    C’est une autre poésie… je sais, je sais

Derniers articles

  • Vis ma vie de Staff/Principal Engineer

    Suite de l’article précédent sur le Staff Engineer. Aujourd’hui, voyons un peu

    20 juillet, 2022
  • Inari

    Devenir Staff Engineer : comment et pourquoi ?

    Après une dizaine d’années en tant que développeur, vous serez un jour

    17 juillet, 2022
  • WeAreDevelopers 2022, conférence à Berlin – jour 1

    Il est 8h40, 19 degrés, vous êtes à Berlin. La queue dehors

    24 juin, 2022

Tweets @nmartignole

  • RT  @katecrawford : Umm, anyone a little concerned that Bard is saying its training dataset includes... Gmail? I'm assuming that's flat out…

    2 days ago
  • Je découvre qu’ils apprennent le SQL en Terminal, très intéressant https://t.co/MrfcHve9wo

    3 days ago
  • RT  @AmelieBenoit33 : Je m’essaye à de nouveaux formats ! Un premier sketch qui me trottait en tête depuis le sketchnote précédent; la techn…

    4 days ago

Mots clés

Apple (32) Architecture (13) Big Data (5) Conference (8) Devoxx (55) Dev Web (37) Doctolib (2) geekevent (1) groovy (2) Innoteria (11) Java (517) Linux (10) Non classé (14) Perso (266) Recrutement (3) Scala (30) scrum (43) Société (3) Startup (20) Web 2.0 (67)

Le Touilleur Express

Blog par Nicolas Martignole

Contactez-moi : nicolas@touilleur-express.fr

Suivez-moi sur Twitter : @nmartignole

Copyright© 2008 - 2020 Nicolas Martignole | Tous droits réservés
  • A propos de l’auteur
  • A propos du Touilleur Express
  • Log In
  • My Account
  • My Profile
  • Reset Password

Le Touilleur Express