Как использовать функцию фильтра в скрипте Scala

Как часть моего обучения, я пытаюсь записать выражение Scala в скрипт scala, но столкнулся с ошибкой.

Scala код, который я успешно выполняю в Scala REPL

def intList = List[1,2,3,4,5]
intList.filter(x => x%2 ==1).map(x => x * x).reduce((x,y) => x+y)

Это успешно выполняется, и вот результат, который я получаю.

scala> intList.filter(x => x % 2 == 1).map(x => x * x).reduce((x,y) => x + y)
res15: Int = 35

Я пытаюсь сделать это как скрипт или класс Scala, чтобы по требованию перезапускать любое количество раз. Я сохраняю это в файле с именем SumOfSquaresOfOdd.scala

import scala.collection.immutable.List

object SumOfSquaresOfOdd extends App
{
    def main(args:Array[String]):Unit =
    {
            var intList = List[Integer](1,2,3,4,5,6,7,8,9,10)
            def sum = intList.filter(x => x % 2 ==1).map(x => x * x).reduce((x+y) => x + y)
            println sum
    }
}

Когда я компилирую это с помощью scalac, на консоли выводится следующая ошибка.

λ scalac SumOfSquaresOfOdd.scala
SumOfSquaresOfOdd.scala:8: error: not a legal formal parameter.
Note: Tuples cannot be directly destructured in method or function parameters.
  Either create a single parameter accepting the Tuple1,
  or consider a pattern matching anonymous function: `{ case (param1, param1) => ... }
            def sum = intList.reduce(x => x % 2 ==1).map(x => x * x).reduce((x+y) => x + y)
                                                                              ^
one error found

Как мне использовать фильтр, карту, методы сокращения в скрипте? Ценю вашу помощь и поддержку.

ОБНОВЛЕНИЕ: опечатки обновлены в коде.

1 ответ

Решение

Я могу ответить на ваш вопрос:

Как мне использовать фильтр, карту, методы сокращения в скрипте?

Но я не могу полностью решить ваш конкретный вариант использования, потому что вы не указали, что должен делать скрипт.

Попробуйте этот код

object SumOfSquaresOfOdd {
    def main(args: Array[String]) : Unit = {
        var intList = List(1,2,3,4,5,6,7,8,9,10)
        def sum = intList.filter(x => x % 2 ==1).map(x => x * x)
        println(sum)
    }
}

затем

~/Code/stack-overflow $ scalac SumOfSquaresOfOdd.scala
~/Code/stack-overflow $ scala SumOfSquaresOfOdd
List(1, 9, 25, 49, 81)

Вы, кажется, немного потерян. Вот несколько советов:

  1. использование Int скорее, чем Integer; Int целочисленный тип Scala И вам не нужно импортировать его.
  2. Не расширяйте App в этом случае. Обратитесь к этому вопросу. Разница между использованием признака App и основного метода в Scala
  3. Используйте оберточные парены для println
  4. Буквальный List(1,2,3) будет зависеть от типа List[Int]; нет необходимости явно набирать его. Проверьте в Scala REPL.
  5. Я думаю ты запутался reduce с filter, Сравните оба в последнем скаладоке: http://www.scala-lang.org/api/current/
  6. Другие способы запуска кода scala: http://joelabrahamsson.com/learning-scala-part-three-executing-scala-code/
  7. Настоятельно рекомендуем вам ознакомиться с принципами функционального программирования в Scala, если вы серьезно относитесь к обучению.

Удачи в изучении Scala!:)

Другие вопросы по тегам