如何使用for在Java中迭代流?

如何使用for在Java中迭代流?,java,foreach,lambda,java-8,java-stream,Java,Foreach,Lambda,Java 8,Java Stream,我有以下代码: List<String> strings = Arrays.asList("a", "b", "cc"); for (String s : strings) { if (s.length() == 2) System.out.println(s); } 我得到只能迭代java.lang.Iterable的数组或实例 我尝试: for (String s : strings.stream().filter(s->s.length() ==

我有以下代码:

List<String> strings = Arrays.asList("a", "b", "cc");
for (String s : strings) {
    if (s.length() == 2)
        System.out.println(s);
}
我得到
只能迭代java.lang.Iterable的数组或实例

我尝试:

for (String s : strings.stream().filter(s->s.length() == 2).iterator()) {
    System.out.println(s);
}
我得到了同样的错误。这可能吗?我真的不希望执行stream.forEach()并传递给消费者


编辑:对我来说,重要的是不要复制元素。

您需要一个iterable,以便能够为每个循环使用一个,例如集合或数组:

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
}

如果使用
,为什么首先要迭代?注意:您的代码可以编写为
strings.stream().filter(s->s.length()==2).forEach(System.out::println)
,如果可以,就不要重构。为了使用流而使用流不是使用流的方式:P你必须原谅我的C#。。。如果(…)continue改成
,你就不会再三考虑了。IEnumerablet上的where(!…)
这个问题的答案是在一个问题中给出的,@TagirValeev链接到的。@fge
forEachOrdered
可能更合适…toArray()复制元素了吗?我忘了在原始问题中提到这一点,但我真的不想复制。@ytoledano是的,它会创建一个新数组,并将元素引用复制到数组中。谢谢,我保持原样。@assylias,当重构旧代码时,可能会有许多不同的情况阻止您使用lambda,比如可变变量或检查异常。从Java-8的角度来看,这可能被认为是糟糕的设计,但它仍然是有效的代码,应该得到支持。同时重构所有内容可能会有问题。我个人看到了许多
for
循环,它们可能受益于流API,但无法轻松转换为
forEach/collect
。还要注意的是,与lambda相比,
for
循环更容易调试。@TagirValeev当然-在有些情况下,for循环更容易,可读性更强。我只是说,如果不知道循环中的内容,很难判断流是否适合。
strings.stream().filter(s->s.length() == 2).forEach(this::process);

private void process(String s) {
  //body of the for loop
}