web-dev-qa-db-fra.com

Comment inverser une seule chaîne dans Java 8 à l'aide de Lambda et Streams?

J'ai une chaîne qui dit "Aniruddh" et je veux l'inverser à l'aide de lambdas et de flux en Java 8. Comment puis-je le faire?

6
Aniruddh Dwivedi

Étant donné une chaîne comme

String str = "Aniruddh";

la solution canonique est

String reversed = new StringBuilder(str).reverse().toString();

Si, peut-être à des fins éducatives, vous voulez résoudre ce problème en transmettant en continu les caractères de la chaîne, vous pouvez le faire

String reversed = str.chars()
    .mapToObj(c -> (char)c)
    .reduce("", (s,c) -> c+s, (s1,s2) -> s2+s1);

C’est non seulement beaucoup plus compliqué, mais aussi de nombreux inconvénients en termes de performances.

La solution suivante élimine les frais généraux liés à la boxe

String reversed = str.chars()
    .collect(StringBuilder::new, (b,c) -> b.insert(0,(char)c), (b1,b2) -> b1.insert(0, b2))
    .toString();

mais est toujours moins efficace car l’insertion au début d’un tampon basé sur un tableau implique la copie de toutes les données précédemment collectées.

Ainsi, pour des applications réelles, l’essentiel est de rester avec la solution canonique présentée au début.

16
Holger

Si vous vraiment voulez le faire à des fins d'apprentissage, pourquoi ne pas inverser le tableau de caractères?

public static String reverse(String test) {
    return IntStream.range(0, test.length())
            .map(i -> test.charAt(test.length() - i - 1))
            .collect(StringBuilder::new, (sb, c) -> sb.append((char) c), StringBuilder::append)
            .toString();
}
3
Eugene

Essayez ceci pour inverser une chaîne en utilisant lambda et les flux

import Java.util.stream.Stream;
import Java.util.stream.Collectors;

    public class Test  {


        public static void main(String[] args) {

            System.out.println(reverse("Anirudh"));;
        }
        public static String reverse(String string) {
            return Stream.of(string)
                .map(Word->new StringBuilder(Word).reverse())
                .collect(Collectors.joining(" "));
        }
    }
2
charlie

Une autre approche pour inverser votre chaîne. Vous pouvez utiliser un IntStream pour extraire le caractère correct d'un tableau char.

public static void main(String[] args) {
    char[] charArray = "Aniruddh".toCharArray();
    IntStream.range(0, charArray.length)
        .mapToObj(i -> charArray[(charArray.length - 1) - i])
        .forEach(System.out::print);
}
0
shinjw

Le moyen le plus simple de réaliser ce que vous demandez en utilisant des flux est probablement le suivant:

String result = Stream.of("Aniruddh").map(__ -> "hddurinA").findFirst().get();