什么是提前终止折扣的最佳方式?作为一个简化的例子,想象一下,我想总结一下数字Iterable,但如果我遇到一些我不期望的东西(比如一个奇数),我可能想要终止.这是第一个近似值
def sumEvenNumbers(nums: Iterable[Int]): Option[Int] = {
nums.foldLeft (Some(0): Option[Int]) {
case (Some(s), n) if n % 2 == 0 => Some(s + n)
case _ => None
}
}
Run Code Online (Sandbox Code Playgroud)
然而,这个解决方案非常难看(如果我做了.foreach和返回 - 它会更清晰和更清晰),最糟糕的是,它遍历整个迭代,即使它遇到非偶数.
那么编写像这样的折叠最好的方法是什么呢?我应该去递归地写这个,还是有一个更被接受的方式?
很像这个问题:
说代码是
def findFirst[T](objects: List[T]):T = {
for (obj <- objects) {
if (expensiveFunc(obj) != null) return /*???*/ Some(obj)
}
None
}
Run Code Online (Sandbox Code Playgroud)
如何在scala中从for循环中生成单个元素?
我不想使用find,就像原始问题中提出的那样,我很好奇是否以及如何使用for循环实现它.
*更新*
首先,感谢所有评论,但我想我在问题中并不清楚.我正在为这样的事情拍摄:
val seven = for {
x <- 1 to 10
if x == 7
} return x
Run Code Online (Sandbox Code Playgroud)
那不编译.这两个错误是: - 返回外部方法定义 - 方法main有return语句; 需要结果类型
我知道在这种情况下find()会更好,我只是在学习和探索语言.在一个更复杂的情况下,有几个迭代器,我认为找到for实际上可以是有用的.
感谢评论者,我将开始赏金以弥补问题的糟糕结果:)
我有一段代码,代码如下:
val e2 = for (e <- elements if condition(expensiveFunction(e))) yield {
expensiveFunction(e)
}
Run Code Online (Sandbox Code Playgroud)
条件对于少数元素是正确的,然后对所有剩余的元素变为假.
不幸的是,这不起作用(即使我忽略性能)因为我elements是一个无限的迭代器.
有没有办法在for-comprehension中使用"break",这样当某个条件成立时它会停止产生元素?否则,计算我的scala-idiomatic方法是e2什么?
当我写下以下内容时,IntelliJ的scalastyle对我很不满.它不喜欢我写的回报.
def hasAnnotation(symbol: Symbol, annotation: Type): Boolean = {
for (a <- symbol.annotations) {
if ( a.tpe =:= annotation ) return true // AVOID USING RETURN!!!
}
false
}
Run Code Online (Sandbox Code Playgroud)
为什么要添加回归邪恶?
如何在不返回的情况下快速迭代?
我需要在scala中读取一些大文本文件.并在该文件中附加一行 StringBuilder.但是如果该文件中的行包含一些String,我需要打破循环.而且我不想将String附加到StringBuilder.例如在java中,循环A将包含"pengkor"在结果字符串中.循环B不包括String,但在循环中有breakscala中不可用的语句.在循环C中,我使用了for语句,但行为与forscala中的循环非常不同 .我主要关心的是不在"pengkor"StringBuilder中包含String而不是将文件的所有内容加载到Scala List(为了scala中的List comprehension或其他一些列表操作),因为文件的大小.
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) { …Run Code Online (Sandbox Code Playgroud)