以下のコードを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);
}
よろしくお願いします!
うわー、皆さんは難しいことをするのが好きです。これが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"
ストリームを使用して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);
text = toRemove.stream()
.reduce(text, (str, toRem) -> str.replaceAll(toRem, ""));
あなたのために働くでしょう。
私があなたを正しく理解しているなら、あなたはこのようなことをしたいと思います:
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, "");
}