私はこのコードを持っています:
List<String> strings = Arrays.asList("a", "b", "cc");
for (String s : strings) {
if (s.length() == 2)
System.out.println(s);
}
フィルターとラムダを使用してそれを書きたい:
for (String s : strings.stream().filter(s->s.length() == 2)) {
System.out.println(s);
}
Can only iterate over an array or an instance of Java.lang.Iterable
。
私が試します:
for (String s : strings.stream().filter(s->s.length() == 2).iterator()) {
System.out.println(s);
}
そして、私は同じエラーを受け取ります。これも可能ですか?私は、stream.forEach()を実行せず、コンシューマーを渡すことを本当に好みます。
編集:要素をコピーしないことが重要です。
コレクションや配列などのfor-eachループを使用するには、イテラブルが必要です。
for (String s : strings.stream().filter(s->s.length() == 2).toArray(String[]::new)) {
または、forループを完全に取り除くこともできます。
strings.stream().filter(s->s.length() == 2).forEach(System.out::println);
Forループをリファクタリングしたくないと言いますが、別のメソッドでその本体を抽出できます。
strings.stream().filter(s->s.length() == 2).forEach(this::process);
private void process(String s) {
//body of the for loop
}