Java 9 : quelques méthodes utiles pour la gestion des strings

Java 9, quelques méthodes utiles pour la gestion des strings
Philippe.jpg
Philippe AUBERTIN, Javaman aigriMis à jour le 11 Juin 2020
java 9 strings

On se retrouve aujourd’hui pour un focus sur les méthodes utiles en JAVA 9 pour la gestion de strings (chaines de caractères). L’idée de cet article est née du constat suivant : souvent, dans les codes de développeurs JavaLangage de développement très populaire !, on voit des choses très complexes... alors qu’il suffisait de faire appel à une feature qui existe déjà pour nous simplifier la vie :)

L’objectif de cet article est donc de vous montrer quelques features très utiles du langage JAVA pour la gestion des strings, qui nous viennent principalement de JAVA 9 et +, et qui vous permettront de gagner un temps précieux dans vos développements.

L’évolution de la gestion des strings (chaines de caractères) en Java 9

Les strings sont des chaines de caractères, et depuis JAVA 9, plein de nouvelles fonctionnalités intéressantes sont apparues ! Avant de présenter les features, prenons le temps de comprendre comment les strings sont gérés en Java.

Rappel : Les strings sont immutables

LA grande notion indispensable, que tout développeur JAVA doit connaitre : les strings sont IMMUTABLES ! C’est-à-dire que toutes les opérations de chaines de caractères ne se font pas à l’intérieur de la string, mais se font à l’extérieur.

Pourquoi les strings sont immutables ?

Pourquoi les strings sont immutables en JAVA ? C’est simplement une question de performances ! Et à ce niveau, il y a eu une très grande évolution dans les dernières versions de JAVA !

La gestion des strings en Java : une question de performances

Dans la mémoire JAVA, quand vous ouvrez une JVM, à peu près 50% de la mémoire consommée, ce sont des chaines de caractères (instanciées par vous ou des références de classes d’objet par exemple). Si un jour vous avez l’occasion d’ouvrir une JVM en exécution (on vous le conseille, c’est intéressant), vous verrez des tableaux de caractères char[] ou byte[]. C’est la majorité de la mémoire consommée, et c’est justement ces tableaux de caractères qui sont derrière la représentation des Strings.

Historiquement en JAVA, les chaines de caractères étaient codées en UTF 16 ; ce qui permet de faire des accents et tout ce que vous ne pouvez pas dans une chaine de caractères.

Cependant, l’équipe JAVA s’est rendue compte que cela prenait beaucoup de mémoire... Ils ont donc réfléchi à une autre manière de faire, et les chaines de caractères ont été compressées/compactées. Aussi, lorsque vous instanciez une chaine de caractères, en fonction de ce que vous mettez dedans, JAVA détermine si c’est de l’encodage unicode ou pas, et va pouvoir avoir une représentation différente des chaines de caractères en char[] ou en byte[].

Pour toutes les chaines de caractères sans accents ou caractères spéciaux, nous sommes passés dans un formatage bien moins gourmand en termes de bits et on gagne pas mal en efficacité mémoire !

Tout cela, c’est bien sûr "under the wood", on ne le voit pas. Seulement, c’est ce qui permet depuis JAVA 8+ d’avoir des JVM très légères à démarrer (quelques dizaines de méga)

Une fois qu’on a dit ça, nous pouvons passer à la présentation de quelques features utiles.

Les fonctions strip()

La fonction Strip() est une amélioration de la fonction trim() existante. Pour rappel, la fonction trim() enlève les espaces avant et les espaces arrière. Donc, elle enlève tout ce qui est avant et après la chaine de caractères.

Cette fonction trim() est apparue au tout début d’Unicode et n’était pas tout à fait compliant avec tout Unicode (Unicode est un standard de représentation de caractères, dans lequel vous avez par exemple les smileys et autre chose).

Dans la méthode trim(), il manque la gestion de la diversité des espacements. Dans 80% des applications, ce n’est pas gênant car quand vous saisissez du code au clavier, les espaces saisis sont des espaces simples, captées par la méthode trim(). Mais si vous êtes sur des applications qui peuvent mettre du texte (comme Whatsapp par exemple), vous pouvez vous retrouver avec des espaces insécables. Ce ne sont pas de vrais espaces tels qu’on a l’habitude de les connaitre, ils ont différentes longueurs, et sont difficiles à virer si vous utilisez trim().

C’est pour cela qu’il existe maintenant une méthode qui s’appelle strip() et qui permet de faire exactement la même chose que trim(), sauf qu’elle est compliant avec l’intégralité des fonctionnalités Unicode.

    String str3 = " JD "; 
    System.out.print("Start");
    System.out.print(str3.strip());
    System.out.println("End");

Fonction StripLeading

La fonction StripLeading permet de supprimer les caractères avant la chaine de caractères.

    System.out.print("Start");
    System.out.print(str3.stripleading());
    System.out.println("End");

Fonction StripTrailing

La fonction StripTrailing() permet de supprimer les caractères après la chaine de caractères.

    System.out.print("Start");
    System.out.print(str3.striptrailing());
    System.out.println("End");

Les fonctions strip() sont particulièrement intéressantes si vous traitez des fichiers qui viennent par exemple d’un import CSV, vous avez moins de chances de vous planter sur le charset du fichier.

La fonction IsBlank()

La fonction IsBlank() est une variation de IsEmpty(). Elle est mieux faite car elle permet de gérer le cas des chaines vides.

Elle traite aussi bien une chaine vide avec des espaces, qu’une chaine vide sans espace.

    System.out.println(" ".IsBlank());

La méthode Lines()

La méthode Lines() est une de nos méthodes préférées, qui peut être utilisée directement sur un String.

Elle permet de créer un Stream (méthode d’enchainement des lectures), et permet de renvoyer directement un Stream sur un Line pour traiter toutes les lignes de manière séquentielle et unitaire dans un String.

Le traitement ligne après ligne est très utile, notamment lorsque vous voulez utiliser des traitements de fichiers CSV. Par exemple, si vous travaillez sur un CSV, faites un skip(1) pour retirer la ligne des entêtes, et c’est parti !

La méthode Indent()

La méthode Indent() peut être utile notamment en cas de débug.

La méthode Indent() sert à indenter, en ajoutant un nombre d’espaces défini, au début de chaque ligne.

A nos yeux, cela peut être vraiment intéressant de s’en servir dans des cas de logger, ou quand vous voulez écrire dans des fichiers.

La fonction Repeat

Elle permet de construire une chaine de caractères en répétant N fois la chaine de caractères.

Cette fonction peut être utile si vous voulez faire des tests et que vous souhaitez construire rapidement des strings.

    String str = "*".repeat(2); 

Et voilà, notre tour d’horizon des features utiles depuis JAVA 9 pour la gestion des chaines de caractères est maintenant terminé. Evidemment, il existe bien d’autres méthodes utiles, mais l’idée était surtout de faire un focus sur celles qui ne sont pas assez connues. Et vous, quelles sont vos features favorites en Java ?