Listとそのstream()方法を使用しているときに質問を見つけました。私が知っている間どのようにそれらを使用するために、私は約かなりよく分からないときにそれらを使用します。
たとえば、さまざまな場所へのさまざまなパスを含むリストがあります。ここで、与えられた単一のパスに、リストで指定されたパスが含まれているかどうかを確認したいと思います。boolean条件が満たされたかどうかに基づいてを返したいのですが。
もちろん、これ自体は難しい作業ではありません。しかし、ストリームを使用する必要があるのか、それともfor(-each)ループを使用する必要があるのかと思います。
リスト
private static final List<String> EXCLUDE_PATHS = Arrays.asList(new String[]{
"my/path/one",
"my/path/two"
});
例-ストリーム
private boolean isExcluded(String path){
return EXCLUDE_PATHS.stream()
.map(String::toLowerCase)
.filter(path::contains)
.collect(Collectors.toList())
.size() > 0;
}
例-For-Eachループ
private boolean isExcluded(String path){
for (String excludePath : EXCLUDE_PATHS) {
if(path.contains(excludePath.toLowerCase())){
return true;
}
}
return false;
}
pathパラメータは常に小文字であることに注意してください。
私の最初の推測は、条件が満たされればループがすぐに戻るため、for-eachアプローチの方が速いということです。一方、ストリームはフィルタリングを完了するためにすべてのリストエントリをループします。
私の仮定は正しいですか?もしそうなら、なぜ(あるいは、むしろとき)私が使用することになりstream()、その後?
new String[]{…}。そのまま使用Arrays.asList("my/path/one", "my/path/two")
String[]を呼び出す必要はありませんArrays.asList。を使用して配列をストリーミングすることができますArrays.stream(array)。ちなみに、isExcludedテストの目的がまったくわかりません。の要素EXCLUDE_PATHSが文字通りパス内のどこかに含まれているかどうかは本当に興味深いですか?すなわち、同様にisExcluded("my/path/one/foo/bar/baz")戻ります…trueisExcluded("foo/bar/baz/my/path/one/")
Arrays.stream、それを指摘して感謝の方法。実際、私が投稿した例は、私以外の誰にとってもまったく役に立たないようです。私はの動作に注意だisExcluded方法が、それは本当に私は自分のために必要なだけの何か、したがって、あなたの質問に答えるために:はい、それはスコープの中に収まらないように私は、言及しないように希望の理由で興味深いものです元の質問の。
toLowerCase小文字の定数に適用されるのですか?それはpath議論に適用されるべきではないのですか?