web-dev-qa-db-ja.com

Java 8ストリーム-文字列の内容を検索する項目のリストに置き換える方法

以下のコードをJava8の.stream()または.foreach()を使用して置き換えます。しかし、私はこれを行うのに苦労しています。

それはおそらく非常に簡単ですが、私は闘争を考えるための機能的な方法を見つけています:)

私は問題なく反復できますが、変更された文字列を返すことは、可変性の問題による問題です。

誰でも何かアイデアはありますか?

List<String> toRemove = Arrays.asList("1", "2", "3");
String text = "Hello 1 2 3";

for(String item : toRemove){
    text = text.replaceAll(item,EMPTY);
}

よろしくお願いします!

7
SteveG

うわー、皆さんは難しいことをするのが好きです。これがfilter()およびcollect()の目的です。

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 + "\"");

出力(元のコードと同様)

"Hello   "

もちろん、検索文字列が1文字より長い場合は、前の方法の方が効果的です。ただし、トークン化された文字列がある場合は、分割と結合の方が簡単です。

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 + "\"");

出力

"Hello 55"
14
Steve K

ストリームを使用してtext変数を変更することはできないため、最終的な結果を得るためにFunctionに適用できる1つのtextに操作を強制する必要があります。

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);
28
Holger
text = toRemove.stream()
               .reduce(text, (str, toRem) -> str.replaceAll(toRem, ""));

あなたのために働くでしょう。

4
yuba

私があなたを正しく理解しているなら、あなたはこのようなことをしたいと思います:

toRemove.forEach(removeString -> {
    text = text.replaceAll(removeString, "");
});

唯一の問題は、それができないことです。 :(

あなたはそれについてここで読むことができます: http://javarevisited.blogspot.co.il/2014/02/10-example-of-lambda-expressions-in-Java8.html

セクション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.

[〜#〜]編集[〜#〜]

あなたはとても醜いことをすることができます。このような:

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