Java 8 de Fluxo de retorno de substituir um cadeias de conteúdo com uma lista de itens para encontrar
-
21-12-2019 - |
Pergunta
Eu gostaria de substituir o código abaixo usando java8 .stream() ou .foreach().No entanto, eu estou tendo problemas para fazer isso.
O seu provavelmente muito fácil, mas eu estou encontrando o funcional maneira de pensar de uma luta :)
Eu posso repetir, nenhum problema, mas o mas voltando a cadeia de modificação é o problema, devido à mutabilidade problemas.
Alguém tem alguma idéia ?
List<String> toRemove = Arrays.asList("1", "2", "3");
String text = "Hello 1 2 3";
for(String item : toRemove){
text = text.replaceAll(item,EMPTY);
}
Obrigado !
Solução
Uau, vocês gostam de fazer as coisas da maneira mais difícil.isso é o que filter() e coletar() são para.
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 + "\"");
saídas (como o código original foi)
"Hello "
É claro que, se as suas linhas de pesquisa são mais do que um carácter, o anterior método funciona melhor.Se você tem um em seqüência, porém, dividir e juntar é mais fácil.
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 + "\"");
saídas
"Hello 55"
Outras dicas
Desde que você não pode utilizar a transmissão em sequência para modificar o text
variável você tem para coagir a operação em um Function
o que você pode aplicar para o text
para obter o resultado 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, ""));
iria trabalhar para você.
Se eu entendi bem, você quer fazer algo como isto:
toRemove.forEach(removeString -> {
text = text.replaceAll(removeString, "");
});
O único problema é que você não pode.:(
Você pode ler sobre ele aqui: http://javarevisited.blogspot.co.il/2014/02/10-example-of-lambda-expressions-in-java8.html
Secção 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.
EDITAR
Você pode fazer algo muito feio.Como esta:
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, "");
}