[英]How to break a loop in scala while reading a file?
我需要在Scala中读取一些大文本文件。 并将该文件中的一行附加到StringBuilder
。 但是,如果该文件中的行包含一些String,则需要中断循环。 而且我不想将该String附加到StringBuilder。 例如,在Java中,循环A
将在结果字符串中包含"pengkor"
。 循环B
不包括该String,但是在循环中有scala中不可用的break
语句。 在循环C中,我使用了for
语句,但是行为与scala中的for
循环完全不同。 我主要关心的是不要在StringBuilder中包含"pengkor"
字符串,也不要将文件的所有内容加载到Scala列表(出于Scala或其他一些列表操作中列表理解的目的),因为文件大小很大。
public class TestDoWhile {
public static void main(String[] args) {
String s[] = {"makin", "manyun", "mama", "mabuk", "pengkor", "subtitle"};
String m = "";
StringBuilder builder = new StringBuilder();
// loop A
int a = 0;
while (!m.equals("pengkor")) {
m = s[a];
builder.append(m);
a++;
}
System.out.println(builder.toString());
// loop B
a = 0;
builder = new StringBuilder();
while (a < s.length) {
m = s[a];
if (!m.equals("pengkor")) {
builder.append(m);
} else {
break;
}
a++;
}
System.out.println(builder.toString());
// loop C
builder = new StringBuilder();
a = 0;
for (m = ""; !m.equals("pengkor"); m = s[a], a++) {
builder.append(m);
}
System.out.println(builder.toString());
}
}
一种方法是将布尔值作为循环中的条件。
val lines = Source.fromPath("myfile.txt").getLines()
val builder = new StringBuilder
var cond = true
while(lines.hasNext && cond) {
val line = lines.next
if(line != "pengkor") {
builder ++= line
} else cond = false
}
//.. do something with the builder
takeWhile
一种类似于Scala的方式是使用takeWhile
。
val lines = Source.fromPath("myfile.txt").getLines()
val builder = new StringBuilder
lines.takeWhile(_ != "pengkor").foreach(builder ++= _)
您还可以在这里查看: 如何在Scala中跳出循环? 看看处理突发事件的其他方法
您可以轻松定义函数并continue
而不是中断
@tailrec
def continue(buf: Array[Byte]) {
val read = in.read(buf);
if (read != -1) {
sb.append(parse(buf, read))
continue(buf); // recur
}
// else do not recur = break the loop
}
continue(Array.fill(1)(0))
逻辑是相反的:您无需中断就可以调用该函数进行下一次迭代。 开销是您需要定义一个函数并调用它。 作为优势,您可以为循环指定一个语义名称,在功能上传递参数,而不是更新变量并重用循环。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.