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?
É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.
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();
}
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(" "));
}
}
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);
}
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();