我在Java 8
foreach流中尝试循环移动下一个项目时遇到问题。我无法将命令设置为continue;
,return;
但只能工作,但是在这种情况下,您将退出循环。我需要继续循环下一个项目。我怎样才能做到这一点?
示例(不起作用):
try(Stream<String> lines = Files.lines(path, StandardCharsets.ISO_8859_1)){
filteredLines = lines.filter(...).foreach(line -> {
...
if(...)
continue; // this command doesn't working here
});
}
示例(工作):
try(Stream<String> lines = Files.lines(path, StandardCharsets.ISO_8859_1)){
filteredLines = lines.filter(...).collect(Collectors.toList());
}
for(String filteredLine : filteredLines){
...
if(...)
continue; // it's working!
}
使用return;
就可以了。这不会阻止完整循环的完成。它将仅停止执行forEach
循环的当前迭代。
试试下面的小程序:
public static void main(String[] args) {
ArrayList<String> stringList = new ArrayList<>();
stringList.add("a");
stringList.add("b");
stringList.add("c");
stringList.stream().forEach(str -> {
if (str.equals("b")) return; // only skips this iteration.
System.out.println(str);
});
}
输出:
一个
ç
请注意,如何return;
为b
迭代执行,但是c
可以在后续迭代中打印出来。
一开始该行为看起来不直观的原因是因为我们习惯于return
中断整个方法的执行的语句。因此,在这种情况下,我们希望整个main
方法执行都将停止。
但是,需要理解的是lambda表达式,例如:
str -> {
if (str.equals("b")) return;
System.out.println(str);
}
……确实需要被认为是它自己独特的“方法”
main
,尽管它很方便地位于其中,但与方法完全分开。因此,实际上,该return
语句仅停止执行lambda表达式。
需要理解的第二件事是:
stringList.stream().forEach()
…实际上只是一个普通的循环,它在每次迭代时都执行lambda表达式。
考虑到这两点,可以按照以下等效方式(仅用于教育目的)重写以上代码:
public static void main(String[] args) {
ArrayList<String> stringList = new ArrayList<>();
stringList.add("a");
stringList.add("b");
stringList.add("c");
for(String s : stringList) {
lambdaExpressionEquivalent(s);
}
}
private static void lambdaExpressionEquivalent(String str) {
if (str.equals("b")) {
return;
}
System.out.println(str);
}
有了等效的“少魔术”代码,该return
语句的范围就变得更加明显。
问题内容: 我正在尝试为特定站点构建代理刮板,但是无法进入下一页。 这是我正在使用的代码。 如果您回答了我的问题,请向我解释一下您所使用的内容,如果可以的话,请向我解释一下,如果有关于此类代码的好的教程,请给我一些: 问题答案: 要转到 下一页, 您可以尝试以下解决方案: 代码块: 控制台输出:
我需要同时在两组div中上下循环。这段代码可以很好地循环列表(button1),但是当我试图创建一个向下按钮(button2)时,它会扰乱div顺序,并且不能正确地循环。我如何修改这段代码,使它成功地以正确的顺序在列表中上下循环? null null
假设我们正在使用这个类: 现在我们有了一个学生名单,我们被问到了一些问题,比如: 筛选姓名为“Jonh”的人并得到平均年龄 过滤那些名字是“玛丽”的人并获得最大的高度 过滤那些名字是“ben”的人,得到最小的权重 我认为一个干净易懂的解决方案是使用lambdas按名称过滤并得到所要求的内容: 我想它至少要在列表上迭代3次,使用带有条件的单个循环可能更有效: 我认为第一种方法更干净,但第二种更快。我
问题内容: 我想知道如何实现由位表示的位串的k 循环 右移。 这些代码所做的全部是 返回0 ,如何使其循环移位? 问题答案: 这应该工作: 另请参阅Wikipedia上有关循环移位的文章。
我目前正在学习位操作,我的任务是做一个左旋转的4位整数。 我的4位左旋转代码是 我想做一个4位循环移位,以保持作为一个4位后旋转,但似乎不能理解它是如何工作的。 例如:10(1010)左旋转1位后给出5(0101),但它给出的值是21,比我的4位多。 任何能让我理解这个问题的帮助都将不胜感激!
我正在迭代两个不同大小的列表: 我要做的是:遍历这两个列表并从array1中挑出所有元素,为此我可以在array2中找到一个元素,该元素与array1中的元素相加产生一定的和。 有没有人知道我怎么用流来处理这个案子?