Java 8 Stream - Comment retourner remplacer une des chaînes de contenu avec une liste d'éléments à trouver
-
21-12-2019 - |
Question
Je souhaite remplacer le code ci-dessous à l'aide de java8 .stream() ou .foreach().Cependant, je vais avoir du mal à faire cela.
C'est probablement très simple, mais je suis la recherche de la fonctionnelle de la façon de penser d'une lutte :)
Je peux réitérer, pas de problème mais le mais le retour de la modification de la chaîne est le problème, en raison de la mutabilité des questions.
N'importe qui ont des idées ?
List<String> toRemove = Arrays.asList("1", "2", "3");
String text = "Hello 1 2 3";
for(String item : toRemove){
text = text.replaceAll(item,EMPTY);
}
Merci !
La solution
WOW, vous aimez faire des choses de manière difficile.C'est ce que filtre () et collecter () sont pour.
List<String> toRemove = Arrays.asList("1", "2", "3");
String text = "Hello 1 2 3";
text = Pattern.compile("").splitAsStream(text)
.filter(s -> !toRemove.contains(s))
.collect(Collectors.joining());
System.out.println("\"" + text + "\"");
sorties (comme le code d'origine le faisait)
"Hello "
Bien sûr, si vos chaînes de recherche sont plus longues qu'un caractère, la méthode précédente fonctionne mieux.Si vous avez une chaîne Tokenized, cependant, scinder et rejoindre est plus facile.
List<String> toRemove = Arrays.asList("12", "23", "34");
String text = "Hello 12 23 34 55";
String delimiter = " ";
text = Pattern.compile(delimiter).splitAsStream(text)
.filter(s -> !toRemove.contains(s))
.collect(Collectors.joining(delimiter));
System.out.println("\"" + text + "\"");
sorties
"Hello 55"
Autres conseils
Puisque vous ne pouvez pas utiliser le flux de modifier la text
la variable que vous avez à contraindre l'opération en un seul Function
que vous pouvez appliquer à la text
pour obtenir le résultat final:
List<String> toRemove = Arrays.asList("1", "2", "3");
String text = "Hello 1 2 3";
text=toRemove.stream()
.map(toRem-> (Function<String,String>)s->s.replaceAll(toRem, ""))
.reduce(Function.identity(), Function::andThen)
.apply(text);
text = toRemove.stream()
.reduce(text, (str, toRem) -> str.replaceAll(toRem, ""));
fonctionnerait pour vous.
Si je vous ai bien compris, vous voulez faire quelque chose comme ceci:
toRemove.forEach(removeString -> {
text = text.replaceAll(removeString, "");
});
Le seul problème est que vous ne pouvez pas.: (
Vous pouvez en lire ici ici: http://javarevisited.blogspot.co.il/2014/02/10-Example-of-lambda-expressions-in-java8.html
SECTION 6: One restriction with lambda expression is that, you can only reference either final or effectively final local variables, which means you cannot modified a variable declared in the outer scope inside a lambda.
Vous pouvez faire quelque chose de très laid.Comme ceci:
private static String text;
public void main (String[] args) {
text = "Hello 1 2 3";
List<String> toRemove = Arrays.asList("1", "2", "3");
toRemove.forEach(removeString -> replaceTextWithEmptyString(removeString));
}
private static void replaceTextWithEmptyString(String whatToReplace) {
text = text.replaceAll(whatToReplace, "");
}