Java 8 de Fluxo de retorno de substituir um cadeias de conteúdo com uma lista de itens para encontrar

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

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 !

Foi útil?

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, "");
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top