Java 8 Stream - Comment retourner remplacer une des chaînes de contenu avec une liste d'éléments à trouver

StackOverflow https://stackoverflow.com//questions/24011597

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 !

Était-ce utile?

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.

Modifier

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, "");
}

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top