相关疑难解决方法(0)

在折叠中早期中止

什么是提前终止折扣的最佳方式?作为一个简化的例子,想象一下,我想总结一下数字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和返回 - 它会更清晰和更清晰),最糟糕的是,它遍历整个迭代,即使它遇到非偶数.

那么编写像这样的折叠最好的方法是什么呢?我应该去递归地写这个,还是有一个更被接受的方式?

functional-programming scala

79
推荐指数
6
解决办法
2万
查看次数

Scala中"返回"语句的目的?

是否有任何真正的理由return在Scala 中提供声明?(除了更"对Java友好")

java scala return

30
推荐指数
3
解决办法
2万
查看次数

如何从scala中的for循环中生成单个元素?

很像这个问题:

用于循环的早期退出的功能代码

说代码是

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实际上可以是有用的.

感谢评论者,我将开始赏金以弥补问题的糟糕结果:)

scala

17
推荐指数
2
解决办法
1万
查看次数

如何在scala中削减for-comprehension short(突破它)?

我有一段代码,代码如下:

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什么?

scala break infinite-sequence for-comprehension

9
推荐指数
2
解决办法
5332
查看次数

scala避免返回,同时仍然在执行迭代

当我写下以下内容时,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

2
推荐指数
1
解决办法
211
查看次数

如何在读取文件时打破scala中的循环?

我需要在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)

java loops scala list

1
推荐指数
1
解决办法
1139
查看次数