Учебное пособие по Scala: пример и код языка программирования Scala

Краткое описание руководства по Scala

В этом руководстве по Scala рассматриваются все аспекты и темы Scala. Вы изучите все основы с нуля, такие как «Что такое Scala», «Процесс установки Scala», «Программы Scala», «Функции Scala», «Ленивые вычисления», «Тип интерфейса», «Классы и объекты», «Наследование», «Абстракции». Java и различия в масштабах и т. д.

Что такое Скала?

масштаб — это статически типизированный язык программирования, который включает в себя как функциональное, так и объектно-ориентированное программирование для повышения масштабируемости приложений. Scala в основном работает на платформе JVM, но ее также можно использовать для написания программного обеспечения для собственных платформ с использованием Scala-Native и JavaСценарий среды выполнения через ScalaJs.

Scala — это масштабируемый язык, используемый для написания программного обеспечения для нескольких платформ. Отсюда и название «Скала». Этот язык предназначен для решения проблем Java и в то же время более лаконичный. Первоначально разработанный Мартином Одерски, он был выпущен в 2003 году.

Зачем изучать Scala

Вот основные причины для изучения языка программирования Scala:

  • Scala легко освоить объектно-ориентированным программистам. Java разработчики. В последние годы он становится одним из популярных языков.
  • Scala предлагает пользователям первоклассные функции.
  • Scala может выполняться на JVM, тем самым открывая путь к совместимости с другими языками.
  • Он предназначен для приложений, которые являются параллельными, распределенными и устойчивыми, управляемыми сообщениями. Это один из самых требовательных языков этого десятилетия.
  • Это краткий, мощный язык, который может быстро расширяться в соответствии с требованиями пользователей.
  • Он объектно-ориентирован и имеет множество функциональных возможностей программирования, предоставляющих разработчикам большую гибкость в написании кода так, как они хотят.
  • Scala предлагает множество типов Duck.
  • В нем меньше шаблонов, если вы родом из Java
  • Фреймворки Lift и Play, написанные на Scala, находятся на кривой роста.

Как установить Скалу

Чтобы начать писать программы на Scala, вам необходимо установить их на свой компьютер. Для этого вам нужно будет посетить их сайт https://www.scala-lang.org/download/ чтобы загрузить последнюю версию Scala.

Перейдя по ссылке, мы перейдем к двум вариантам установки Scala на наши машины. Для этого руководства по Scala мы загрузим IntelliJ IDEA.

Как установить Скалу

Перейдя по ссылке для скачивания, вы найдете две версии IntelliJ IDE.

Для этого руководства по Scala мы загрузим Community Edition, которая бесплатна и содержит все необходимое для написания программ Scala.

Как установить Скалу

Шаг 1) Выберите версию сообщества
На странице щелкните раскрывающийся список Community Edition.

Он дает нам возможность загрузить IntelliJ IDE вместе с JBR, которая содержит реализацию JDK (Java Комплект разработки) OpenJDK, который необходим Scala для компиляции и запуска кода.

Как установить Скалу

Шаг 2) Запустите установку
После загрузки IntelliJ дважды щелкните его, чтобы запустить мастер установки, и следуйте инструкциям в диалоговом окне.

Как установить Скалу

Шаг 3) Выберите место
Выберите место для установки IDE.

Как установить Скалу

Если случайно вы не загрузили тот, который содержит JDK, мы все равно получим подсказку, в которой мы можем проверить его загрузку, установив флажок.

Как установить Скалу

Шаг 4) Нажмите на следующий
Остальные значения по умолчанию оставьте без изменений и нажмите «Далее».

Как установить Скалу

Шаг 5) Нажмите на значок запуска
После завершения установки запустите IntelliJ IDE, щелкнув значок запуска в меню запуска, как обычное приложение.

Как установить Скалу

Вам все равно нужно выполнить дополнительный шаг по добавлению плагина Scala в IntelliJ; вы можете сделать это, щелкнув раскрывающийся список в меню настройки, расположенном в правом нижнем углу экрана, и выбрав опцию плагина.

Как установить Скалу

Как установить Скалу

На вкладке «Маркетплейс» при поиске Scala плагин будет отображаться в качестве первого результата под тегом «Языки».

Шаг 6) Установить плагин
Нажмите «Установить», после чего плагин начнет загрузку.

Как установить Скалу

Шаг 7) Перезагрузите IDE.
После завершения загрузки вам будет предложено перезапустить IDE, чтобы установленный плагин мог начать работать.

Как установить Скалу

После перезапуска вы окажетесь на той же странице, что и раньше, когда мы запускали IDE, но на этот раз мы уже установили плагин Scala.

Программа Scala Hello World

Шаг 1) Выберите опцию «Создать проект», которая приведет нас на страницу, где мы сможем выбрать тип языка, который будет использовать наш проект.

Программа Scala Hello World

Шаг 2) выберите Scala, установив флажок Scala и нажмите «Далее».

Программа Scala Hello World

Шаг 3) Выберите место для сохранения файла нашего проекта и дайте нашему проекту имя.

Программа Scala Hello World

Если каталог не существует, IntelliJ предложит нам запросить разрешение на создание папки. Примите и нажмите «Готово». Вы попадете в свой проект Scala, который в настоящее время не имеет кода Scala.

Загрузка некоторых индексов займет некоторое время, поэтому не волнуйтесь, если вы не можете немедленно что-либо сделать, пока в нижней части вашей IDE есть индикатор выполнения, это просто означает, что ваша IDE загружает некоторые файлы, необходимые для запуска Scala и Помогите с автодополнением IDE.

Шаг 4) Затем мы щелкнем вкладку «Проекты» слева от IDE и развернем ее, чтобы увидеть содержимое нашего проекта.

Программа Scala Hello World

На данный момент проект пуст и содержит только папку .idea и файл hello-world.iml, созданный IDE. Нас интересует папка src. Src — это место, где мы храним исходный код нашего проекта. Здесь мы создадим наш первый файл Scala.

Шаг 5) Щелкните правой кнопкой мыши src, чтобы открыть меню для создания нового файла Scala.

Создайте новый файл Scala.

Затем мы создадим имя для файла. В этом руководстве по Scala мы будем использовать hello, а затем выберем из раскрывающегося списка, что поместить в качестве содержимого файла Scala. Выберите «Объект»

Программа Scala Hello World

Как только мы это сделаем, у нас будет файл Scala с объектом Singleton, который мы будем использовать для запуска нашего кода.

Программа Scala Hello World

Теперь у вас есть файл Scala с объектом Hello. Вы напишете свою первую программу, расширив созданный объект с помощью ключевого слова App.

Расширение нашего объекта с помощью App сообщает компилятору, какой код запускать при запуске вашей программы. Сразу после расширения приложения слева появляется зеленая стрелка, указывающая, что теперь вы можете запустить свою программу.

Программа Scala Hello World

Программа Scala Hello World

Внутри объекта Hello мы пишем одну функцию println(), которая используется для печати текста внутри него на консоль. Мы запустим наш код, нажав на зеленую стрелку.

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

Программа Scala Hello World

И вот, мы успешно установили Scala и запустили нашу первую программу.

Что вы можете сделать с помощью Scala

  • Фронтенд-разработка на ScalaJS.
  • Мобильная разработка, обе Android Разработка и IOS – с помощью Scala Native
  • Серверные библиотеки, такие как HTTP4S, Akka-Http, Play Framework.
  • Интернет вещей с использованием
  • Разработка игр
  • НЛП — обработка естественного языка с использованием набора библиотек ScalaNLP.
  • Тестирование передовых методов программирования, таких как функциональное программирование и объектно-ориентированное программирование.
  • Создайте высокопараллельное коммуникационное приложение, используя актеров и библиотеку для JVM, вдохновленную Erlang.
  • Используйте его для машинного обучения, используя такие библиотеки, как Figaro, который занимается вероятностным программированием, и Apache. Spark которые

Анонимные функции

В языке Scala есть анонимные функции, которые также называются функциональные литералы. Будучи функциональным языком, Scala часто означает, что разработчики разбивают большие проблемы на множество мелких задач и создают множество функций для решения этих проблем. Чтобы упростить создание функций, Scala содержит функции, которые можно создан без имени. Мы можем присвоить их непосредственно переменным или определениям «def», как показано в примере Scala ниже:

val multiplyByTwo = (n:Int) => n * 2
def multiplyByThree = (n:Int) => n *3

Затем мы можем использовать обычный способ использования функций, передавая им параметры.

multiplyByTwo(3)

//6

multiplyByThree(4)

//12

Эти методы пригодятся, когда мы хотим иметь чистый и лаконичный код. Мы можем использовать анонимные функции при определении методов, которые невелики по размеру и не требуют большого количества кода в своем теле. Они очень просты и не требуют церемонии для создания.

Эти методы не ограничиваются функциями с аргументами и могут использоваться для создания экземпляров методов, которые не принимают никаких аргументов.

val sayHello = ()=>{ println("hello") }

Большинство этих анонимных функций используются в других частях нашего кода, где нам нужно создать быструю функцию.

Еще одна причина, по которой эти функции также называются встроенные функции. Использование анонимных функций — это распространенный шаблон, который широко используется в библиотеке коллекций для выполнения быстрых действий над коллекцией.

Например, у нас есть метод фильтра, который использует встроенную функцию/анонимную функцию для создания другой коллекции, состоящей только из элементов, соответствующих критериям, которые мы определяем в анонимной функции.

val myList = List(1,2,3,4,5,6,7)

val myEvenList = myList.filter((n: Int) => n % 2 == 0)
//List(2,4,6)

val myOddList = myList.filter((n:Int) => n % 2 != 0)
//List(1,3,5,7)

Здесь методы, которые у нас есть как анонимные функции, проверяют, является ли значение, которое мы получаем из списка, нечетным или четным, и возвращают элемент.

//the one checking that the value is even
(n: Int) => n % 2 == 0

//the one checking that the value is odd
(n:Int) => n % 2 != 0

В Scala также можно использовать подстановочные знаки, если параметр нашей анонимной функции не назван. Например

var timesTwo = (_:Int)*2

timesTwo(5)
//10

В этом сценарии мы не называем передаваемый параметр. Единственное, что мы используем для его обозначения, — это подчеркивание.

Ленивая оценка

Большинство языков последовательно оценивают переменные и параметры функции, один за другим. В Scala у нас есть ключевое слово lazy, которое помогает работать со значениями, которые мы не хотим оценивать, пока на них не ссылаются.

Переменная, помеченная как ленивая, не будет оцениваться там, где она определена (это обычно называется нетерпеливой оценкой), она будет оцениваться только тогда, когда на нее ссылаются где-то позже в коде.

Это может быть полезно, когда оценка значения может оказаться дорогостоящим вычислением. Если это не тот случай, когда значение всегда необходимо, мы можем избавить себя от выполнения дорогостоящих вычислений, которые могут замедлить работу нашего программного обеспечения, сделав нашу переменную ленивой.

lazy val myExpensiveValue = expensiveComputation

def runMethod()={
    if(settings == true){
        use(myExpensiveValue)
    }else{
        use(otherValue)
    }
}

Это не единственный вариант использования ленивых переменных. Они также помогают решать проблемы циклической зависимости в коде.

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

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

Лень также помогает с аргументами функции, где аргументы используются только тогда, когда на них есть ссылка внутри функции. Эта концепция называется параметрами вызова по имени.

def sometimesUsedString(someValue:String, defaultValue:=> String)={
 if(someValue != null){
   use(defaultValue)
 }else{
   use(someValue)
   }
 }

Во многих языках используется метод оценки аргументов по значению. Параметр, передаваемый через вызов по имени, будет оцениваться только при необходимости в теле функции и не будет оцениваться до этого. После оценки значения оно сохраняется и может быть повторно использовано позже без необходимости повторной оценки. Концепция, известная как мемоизация.

Вывод типа

В Scala вам не нужно объявлять типы для каждой создаваемой вами переменной. Это связано с тем, что компилятор Scala может выполнять вывод типов на основе оценки правой части. Это позволяет сделать ваш код более кратким — это освобождает нас от написания шаблона, в котором ожидаемый тип очевиден.

var first:String = "Hello, "
var second:String = "World"
var third = first + second
//the compile infers that third is of type String

Функция высшего порядка

Функция высшего порядка — это функция, которая может принимать функции в качестве аргументов и возвращать функцию в качестве возвращаемого типа. В Scala функции считаются первоклассными гражданами. Использование этих функций таким образом позволяет нам быть очень гибкими в выборе программ, которые мы можем создавать. Мы можем динамически создавать функции и динамически передавать функциональность другим функциям.

def doMathToInt(n:Int, myMathFunction:Int=>Int): Int ={
    myMathFunction(n)
}

В приведенной выше функции мы передаем int и функцию, которая принимает int и возвращает int. Мы можем передать любую функцию этой сигнатуры. Под сигнатурой мы подразумеваем ввод и вывод функции. Сигнатура Int=>Int означает, что функция принимает Int в качестве входных данных и возвращает Int в качестве выходных данных.

Сигнатура ()=>Int означает, что функция ничего не принимает на вход и возвращает Int на выходе. Примером такой функции может быть функция, которая генерирует для нас случайное целое число.

def generateRandomInt()={
 return scala.util.Random.nextInt()
}

Вышеупомянутая функция имеет подпись ()=>Int

У нас может быть функция с сигнатурой scala ()=>Unit. Это означает, что функции ничего не принимают и не возвращают тип. Функция может выполнять какие-то вычисления, изменяя что-то на что-то заранее определенное.

Однако подобные методы не приветствуются, поскольку они кажутся черным ящиком, который может каким-то неизвестным образом повлиять на систему. Они также не поддаются проверке. Наличие явных типов ввода и вывода позволяет нам рассуждать о том, что делает наша функция.

Функция более высокого порядка также может возвращать функцию.

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

def powerByFunction(n:Int):Int=>Int = {
  return (x:Int)=> scala.math.pow(x,n).toInt
}

Вышеупомянутая функция принимает int. Наш тип возвращаемого значения — это анонимная функция, которая принимает Int x, * мы используем int x в качестве аргумента для степенной функции.

Карринг

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

Это может быть полезно для динамического создания функций до того, как у нас будет полный набор аргументов.

def multiply two numbers(n:Int)(m:Int): Unit ={
  return n * m
}

Если нам нужно создать функцию, которая умножает на какое-то конкретное число, нам не нужно создавать другой метод умножения.

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

def multiplyTwoNumbers(n:Int)(m:Int): Unit ={
  return n * m
}

var multiplyByFive = multiplyTwoNumbers(5) 

multiplyByFive(4)

//returns 20

Соответствие шаблону

В Scala имеется мощный встроенный механизм, помогающий нам проверить, соответствует ли переменная определенным критериям, подобно тому, как мы это делаем в операторе переключения в Java или в серии операторов if/else. В языке есть сопоставление с образцом, которое мы можем использовать, чтобы проверить, относится ли переменная к определенному типу. Сопоставление с образцом в Scala является мощным инструментом, и его можно использовать для деструктуризации компонентов, имеющих метод unapply, чтобы получить интересующие нас поля непосредственно из сопоставляемой переменной.

Сопоставление с образцом в Scala также обеспечивает более приятный синтаксис по сравнению с оператором переключения.

myItem match {
  case true => //do something
  case false => //do something else
  case  _ => //if none of the above do this by default
}

Мы сравниваем нашу переменную с набором параметров, и когда сопоставляемая переменная соответствует критериям, выражение в правой части жирной стрелки (=>) оценивается и возвращается как результат сопоставления.

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

class Animal(var legs:Int,var sound:String)
class Furniture(var legs:Int, var color:Int, var woodType:String)

myItem match {
case myItem:Animal => //do something
case myItem:Furniture => //do something else
case _ => //case we have a type we don't recognize do sth else
}

В приведенном выше коде вы можете узнать тип переменной myItem и на основе этого перейти к определенному коду.

Сопоставление с образцом проверяет, соответствует ли переменная

Подчеркивание работает как заполнитель, который соответствует любому другому условию, которому не соответствуют другие элементы в приведенных выше операторах случая. Берем переменную myItem и вызываем метод match.

  • мы проверяем, является ли myItem истинным, используя и выполняем некоторую логику с правой стороны жирной стрелки «=>».
  • мы используем подчеркивание для соответствия всему, что не соответствует ни одному из операторов случая, которые мы определили в коде.

С классами Case мы можем пойти еще дальше и деструктурировать класс, чтобы получить поля внутри объекта.

Используя ключевое слово «sealed» для определения наших классов, мы получаем преимущество от того, что компилятор полностью проверяет случаи, с которыми мы пытаемся сопоставить, и предупреждает нас, если мы забудем обработать конкретный из них.

неизменность

Используя ключевое слово val, можно создавать значения, которые не могут быть изменены другими функциями Scala. Это достигается в Java используя последнее ключевое слово. В Scala мы делаем это, используя ключевое слово val при создании переменной вместо использования var, которое является альтернативой, которую мы использовали бы для создания изменяемой переменной.

Переменная, определенная с помощью ключевого слова val, доступна только для чтения, тогда как переменная, определенная с помощью var, может быть прочитана и изменена другими функциями или произвольно пользователем в коде.

var changeableVariable = 8

changeableVariable =10
//the compiler doesn't complain, and the code compiles successfully

println(changeableVariable)
//10

val myNumber = 7

myNumber = 4

//if we try this the code won't compile

Попытка присвоить значение myNumber после того, как мы объявили его как val, вызывает ошибку времени компиляции или «переприсвоение val».

Зачем использовать неизменяемость?

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

Классы и объекты

Мы все знаем, что объекты — это сущности реального мира, а класс — это шаблон, определяющий объекты. Классы имеют как состояние, так и поведение. Состояния являются либо значениями, либо переменными. Поведения — это методы в Scala.

Давайте посмотрим, как можно определить класс, создать его экземпляр и использовать с помощью Scala.

Здесь класс Rectangle имеет две переменные и две функции. Вы также можете использовать параметры l и b непосредственно в качестве полей в программе. У вас есть объект, который имеет основной метод и создал экземпляр класса с двумя значениями.

Пример:

class Rectangle( l: Int,  b: Int) {
  val length: Int = l
  val breadth: Int = b
  def getArea: Int = l * b
  override def toString = s"This is rectangle with length as $length and breadth as  $breadth"
  }
object RectObject {
  def main(args: Array[String]) {
    val rect = new Rectangle(4, 5)
    println(rect.toString)
    println(rect.getArea)    
  }
}

Все поля и методы по умолчанию общедоступны в Scala. Очень важно использовать переопределение, поскольку метод toString определен для объекта в Scala.

наследование

Scala имеет несколько типов наследования (например, одиночное, многоуровневое, множественное, иерархическое, гибридное), которые имеют много общего с традиционными формами, встречающимися в Java. Вы можете наследовать как классы, так и черты. Вы можете наследовать членов одного класса в другой класс, используя ключевое слово «extends». Это обеспечивает возможность повторного использования.

Возможно наследование от одного класса или нескольких классов. Также возможно наследовать от подклассов, которые сами имеют свои суперклассы, создавая при этом иерархию наследования.

В приведенном ниже примере Scala базовым классом является Circle, а производным классом — Sphere. У круга есть значение, называемое радиусом, которое наследуется от класса Sphere. Метод CalcArea переопределяется с помощью ключевого слова override.

Пример:

class Circle {
  val radius = 5;
  def calcArea = {
    println(radius * radius )
  }
}
class Sphere extends Circle{
 override def calcArea = {
    println(radius * radius * radius )
  }
}
  object SphereObject{
    def main(args : Array[String]){
      new Sphere().calcArea 
    }
  }

абстракция

В Scala мы можем создавать абстрактные методы и поля-члены, используя абстрактные классы и признаки. Внутри абстрактных классов и признаков мы можем определять абстрактные поля, не обязательно реализуя их.

Пример:

trait MakesSound{
    var nameOfSound:String
    def sound():String
}
abstract class HasLegs(var legs:Int){
    val creatureName:String

    def printLegs():String={
        return s"$creatureName has this number of legs: $legs"
    }
}

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

trait DatabaseService{
    def addItemName(itemName:String)
    def removeItem(itemId:Int)
    def updateItem(itemId:Int, newItemName:String)
}

Таким образом, мы можем спланировать, как будет выглядеть наше приложение, не реализуя методы, которые помогут нам представить, как будут выглядеть различные методы. Это следует шаблону, известному как программирование абстракций, а не фактической реализации.

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

Одноэлементные объекты

Синглтон — это класс, экземпляр которого создается в программе только один раз. Он взят из популярного и полезного шаблона программирования, известного как «шаблон Singleton». Это полезно при создании экземпляров, которые предназначены для длительного существования и будут широко доступны во всей вашей программе, состояние которых является неотъемлемой частью координации событий системы. Создать такой класс в Scala легко, поскольку Scala предоставляет нам простые средства создания синглтонов с использованием ключевого слова object.

object UserProfile{
    var userName=""
    var isLoggedIn:Boolean = false
}

Затем мы можем ссылаться на этот объект во всей нашей программе с гарантией, что все части нашей программы будут видеть одни и те же данные, поскольку существует только один их экземпляр.

def getLoggedInStatus():Boolean={
   return UserProfile.isLoggedIn
}

def changeLoggedInStatus():Boolean={
    UserProfile.isLoggedIn = !UserProfile.isLoggedIn
    return  UserProfile.isLoggedIn
}

В Scala нет концепции статических членов, поэтому вам нужно использовать одноэлементные объекты, которые действуют как статические члены класса.

Неявные классы

Неявные классы — это новая функциональность, добавленная после версии 2.1. В первую очередь это добавление нового функционала в закрытые классы.

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

В приведенном ниже примере Scala добавлена ​​новая функция замены гласных строки на *.

object StringUtil {
  implicit class StringEnhancer(str: String) {
    
    def replaceVowelWithStar: String = str.replaceAll("[aeiou]", "*")
  }
}

Вам необходимо импортировать в класс, где вы его используете.

import StringUtil.StringEnhancer

object ImplicitEx extends App {
  val msg = "This is Guru99!"
  println(msg.replaceVowelWithStar)
}

Объектно-ориентированное программирование (ООП) и функциональное программирование (FP)

В ООП программы создаются путем группировки данных и функций, которые работают с этими данными, в тесно связанные блоки. Объекты переносят свои данные в поля и методы, которые с ними работают. В этом стиле программирования основной абстракцией являются данные, поскольку создаваемые методы предназначены для работы с данными.

Функциональное программирование, с другой стороны, разделяет данные и функции, которые работают с данными. Это позволяет разработчикам рассматривать функции как абстракцию и движущую силу при моделировании программ.

Scala делает возможным функциональное программирование, используя функции в качестве первоклассных элементов, позволяя передавать их в качестве значений другим функциям и возвращать также в виде значений. Сочетание этих двух парадигм сделало Scala отличным выбором для создания сложного программного обеспечения в различных отраслях, таких как Data Science.

Важные фреймворки на Scala

Вот некоторые важные фреймворки Scala.

  • Играть это платформа веб-приложений с открытым исходным кодом, которая использует Архитектура MVC. Выпущенный в 2007 году и теперь лицензированный Apache. В 2013 году он стал самым популярным фреймворком на GitHub. Эту платформу используют такие компании, как LinkedIn, Walmart, Samsung, Eero.
  • Лифт — еще один бесплатный веб-фреймворк, написанный на Scala, запущенный в 2007 году. Foursquare использует фреймворк Lift. Он высокопроизводительный, позволяет быстрее создавать структуру.
  • Акка
  • Кошки - Leecork
  • Spark

Поддержка параллелизма

  • Значения в Scala по умолчанию неизменяемы. Это делает его очень адаптивным к параллельной среде.
  • В Scala имеется множество функций, которые делают ее лучшей для параллельных приложений.
  • Фьючерсы и промисы упрощают асинхронную обработку данных, тем самым поддерживая параллелизм.
  • Akka — набор инструментов, использующий модель параллелизма актеров. Существует ряд актеров, которые действуют, когда получают сообщения.
  • Параллелизм с использованием потоков из Java также может поддерживаться в Scala.
  • Потоковая обработка — еще одна замечательная функция, обеспечивающая непрерывную обработку данных в реальном времени.

Scala имеет одни из лучших библиотек параллелизма в мире. Java экосистемы.

  • Родной Java темы
  • Волокна из таких библиотек, как Vertex
  • ZIO — библиотека, в которой есть примитивы, помогающие нам справляться с параллельными и асинхронными вычислениями.
  • СТМ – Транзакция
  • Будущее – встроено в язык Scala

Java против Скалы

Вот основные Разница между Java и Скала.

масштаб Java
Более компактный и лаконичный Сравнительно большие куски кода
Разработан и спроектирован как объектно- и функционально-ориентированный язык.
Поддерживает широкий спектр функций функционального программирования, таких как параллелизм и неизменяемость.
Первоначально разрабатывался как объектно-ориентированный язык и в последние дни начал поддерживать функции функционального программирования. Все еще не силен как функциональный язык программирования.
Использует модель актера для поддержки параллелизма, которая является современной. Использует традиционную модель на основе потоков для параллельного выполнения.
Поддерживает фреймворки – Play, Lift Поддерживает Spring, Grails и многое другое.
Поддерживает ленивую оценку Не поддерживает ленивую оценку
Нет статических членов Содержит статические члены
Поддерживает перегрузку оператора Не поддерживает перегрузку оператора
Компиляция исходного кода происходит сравнительно медленно. Компиляция исходного кода происходит быстрее, чем Scala.
Черты характера – вести себя как Java 8 интерфейса Java 8 интерфейсов пытаются преодолеть разрыв между классами и интерфейсами.
Требуется переписывание Переписывание не требуется
Нет уверенности в том, что коды без ошибок Полная гарантия устранения меньших дефектов
Поддерживает обратную совместимость. Scala не поддерживает обратную совместимость.
OperaТоры рассматриваются по-разному в Java и не являются вызовами методов. Все операторы над записями выполняются с помощью метода, называемого в Scala.
Поддерживает множественное наследование с использованием классов, но не абстрактных классов. Поддерживает множественное наследование не с помощью классов, а через интерфейсы.
Код написан в компактной форме. Код пишется в длинной форме.
Scala не содержит ключевого слова static. Java содержит ключевое слово static.

Резюме

Из этого руководства вы узнали, как начать работу со Scala. Вы также изучили функциональные и объектно-ориентированные возможности. Вы также обнаружили сходства и различия между Java и Скала. Это руководство должно было помочь вам с помощью широкого спектра хорошо продемонстрированных примеров.