Начало работы со Scala для разработки на Java

Java

предисловие

О языке Scala я вообще-то давно слышал, но дальше толком не разбирался, знаю только, что этот язык очень популярен в сфере больших данных. Так же, как рост разработки больших данных в последние несколько лет, он действительно сделал этот язык на основе JVM популярным. Поскольку я недавно начал участвовать в проектах компании по работе с большими данными, сталкиваясь с потребностями в вычислениях и обработке больших объемов данных, текущего стека технологий, основанного на Java, далеко не достаточно, и мне нужно внедрить платформы для работы с большими данными, такие как Spark. написан на Scala, хотя Spark предоставляет Java API, но для того, чтобы лучше использовать Spark и своевременно устранять проблемы, которые могут возникнуть, необходимо полностью изучить язык Scala.

Основное содержание этой статьи следующее:

  • Базовое введение в Scala
  • Введение в возможности синтаксиса Scala
  • Scala и SpringBoot в действии

Пример проекта:GitHub.com/ Как будто впервые увидел 12138…

Экологическая поддержка:

  • JDK 8
  • SpringBoot 2.1.5
  • Maven 3.6.0
  • Scala 2.12.8

Познакомьтесь со Скала

Прежде чем мы познакомимся со Scala, давайте сначала разберемся, как читается Scala и откуда она взялась. Тем более, как китайскому программисту, головная боль - столкнуться со словами, которые появляются в новых технологиях, но я их не могу прочитать или читаю очень искаженно. Вот яBaidu переводчикФонетическая транскрипция Scala была найдена в[ˈskɑlə]и произношение слов для справки.

Далее давайте кратко рассмотрим историю Scala: Scala — это язык программирования, разработанный профессором Мартином Одерски из Федерального технологического института в Лозанне, Столкнувшись со строгими языковыми ограничениями Java, профессор Мартин переработал более современный, адаптируемый язык. основанный на масштабируемом языке JVM и аббревиатуре Scala этого масштабируемого языка в качестве имени, это происхождение Scala. С момента выпуска Scala на основе платформы Java в конце 2003 г. стабильная версия теперь достигла 2.12.8.Можно сказать, что скорость итерации Scala по-прежнему очень высока.

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

Scala combines object-oriented and functional programming in one concise, high-level language. Scala's static types help avoid bugs in complex applications, and its JVM and JavaScript runtimes let you build high-performance systems with easy access to huge ecosystems of libraries.

Из приведенного выше отрывка мы можем извлечь следующую информацию:

  1. Scala — это статически типизированный язык программирования высокого уровня, сочетающий в себе черты объектно-ориентированного и функционально-ориентированного программирования.
  2. Scala может работать на JVM, а также в среде выполнения JavaScript.
  3. Scala часто используется для создания высокопроизводительных программ и фреймворков.

Мы изучим и попробуем богатые возможности языка Scala в разделе синтаксиса Scala ниже; для создания высокопроизводительных программ и фреймворков подойдут текущие фреймворки проектов в области больших баз данных, Spark, Flink, Kafka и т. д. разработан на основе Scala., что показывает, что использование Scala, несомненно, полезно в высокопроизводительных сценариях.

Возможности языка Scala

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

Разобравшись со Scala в целом, давайте быстро начнем настройку среды Scala, а затем напишем нашу первую строку кода Scala.

Настройка среды Scala

Построить среду Scala на самом деле очень просто, по аналогии с опытом настройки языковой среды Java можно подытожить два шага:

Примечание. Перед загрузкой установочного пакета Scala вам необходимо иметь JDK 8 или более позднюю версию в локальной среде.

  1. отОфициальный сайт СкалаЗагрузите архив языка 2.12.8 и распакуйте его на локальный диск.

    image-20190608011135438

  2. Добавьте переменную среды Scala и укажите ее в качестве распакованной папки Scala.Поскольку моя машина является средой Mac, мне нужно только работать с файлом конфигурации Shell и изменять файл конфигурации Shell.~/.bash_profileДобавьте следующее содержимое в конец файла, используя командуsource ~/.bash_profileСделайте так, чтобы конфигурация вступила в силу.

    carbon

После выполнения вышеуказанных шагов ввод командной строкиscala -versionКогда вы получите то же содержимое, что и на следующем рисунке, это означает, что языковая среда Scala готова.

查看 Scala 版本

Взаимодействие с командной строкой Scala

Scala REPL

В отличие от Java, Scala также обеспечивает взаимодействие в режиме командной строки, который профессионально называется REPL (Read-eval-print-loop).Scala REPL OVERVIEW; Исходя из этого, мы можем использовать язык Scala прямо в командной строке.Если у вас Python или Node.js, вы должны быть знакомы с этим методом взаимодействия при программировании.

Первый тип в командной строкеscalaперейти в интерактивный режим и ввестиprintln("Hello,Scala")Enter, вот такая простейшая Scala-версия HelloWorld завершена.

REPL

используется здесьprintlnЭто метод печати в Scala, аналогичный методу в Java.System.out.println, это очень лаконично?

Компилировать классы Scala

Помимо взаимодействия с командной строкой, давайте попробуем реализовать Scala-класс HelloWorld.

Сначала создайте новыйHelloWorld.scalaфайл, напишитеmainметод.

HelloWord.scala

Кажется, что способ написания Scala отличается от Java.mainРазве метод не сильно отличается? Давайте попробуем сначала запустить, а потом мы узнаем больше о грамматике.

Затем вам нужно скомпилировать и запустить исходный код.Как и в Java, библиотека Scala предоставляет инструмент компилятора Scala scalac, который может компилировать файлы Scala в байт-код, также есть инструменты интерпретатораscalaИспользуется для запуска байт-кода.

Скомпилируйте и сгенерируйте с помощью scalacHelloWorld.classдокумент;

scalac HelloWorld.scala

Наконец, чтобы запустить, выполнитьscala HelloWorld, консольный вводHelloWorldЭто означает, что операция прошла успешно.

HelloWorld

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

Синтаксис Скала

Переменная

В Scala есть два ключевых слова для объявления переменных:var & val.varдля объявлений переменных переменных, даvariableсокращение дляvalдля постоянных объявлений, даvalueсокращение для . Ниже приведен общий способ записи: между именем определенной переменной и ее типом требуется двоеточие.:разделены.

val x: Int = 1+1
var y: String = "abc"

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

Но в отличие от Java, которая должна указывать тип переменной при объявлении переменной, в Scala есть функция вывода типа, поэтому нет необходимости явно объявлять тип, поэтому мы можем записать его в следующем виде:

val x = 1+1
var y = "abc"

Теперь давай поговоримvarиvalРазница:valКонстанты, используемые для объявлений, не могут быть изменены после присваивания, и при попытке изменить значение произойдет ошибка компиляции.

carbon

Кроме того,valКогда переменной назначается ссылочный объект, свойства объекта могут быть изменены, но он больше не может указывать на другие объекты, поэтомуvalМожно понимать как используемый в JavafinalМодифицированная переменная.

тип данных

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

Scala 类型层次图

Существует восемь основных типов данных в Java и девять основных типов данных в Scala, кромеDouble,Float,Long,Int,Short,Byte,Boolean, и еще одинUnittype, представляющий тип без какого-либо значения, с одним и только одним значением:(), который можно понимать как Javavoid, используется, когда функция определена, чтобы указать, что функция не имеет возвращаемого значения.

Эти базовые типы имеют суперклассAnyVal, который представляет универсальный тип значения, иAnyValОтносительный - это ссылочный типAnyRef, объекты коллекции в Scala (Set,Map), строковый класс (String), а пользовательские классы принадлежатAnyRef, что эквивалентно Javajava.lang.Object.

существуетAnyValиAnyRefВыше находится тип верхнего уровня Scala, который определяет некоторые из наиболее общих методов, таких какequals,hashCodeиtoString.

Ничто и ноль

В нижней части иерархии типов Scala есть еще два типа.NothingиNull,NothingЭто подтип всех типов, и в этом типе нет значения, которое в основном используется для аварийного возврата программных исключений и прерываний; иNullявляется подтипом ссылочного типа и имеет только одно значение:null, в основном используется при взаимодействии с Java.

преобразование типа значения

Различные типы значений, Scala также поддерживает преобразование типов, и оно является однонаправленным.Ниже приведена диаграмма направления преобразования значения.

值类型转换

И если вы попробуете преобразовать тип в неуказанном направлении, он не скомпилируется, и сразу будет выдано сообщение об ошибке:type mismatch, следующий пример:

mismatch

метод/функция

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

方法/函数

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

Сначала посмотрите на определение функции,=>Слева — список параметров (тип здесь нельзя опускать), справа — содержимое выражения, из вышеприведенногоaddВывод типа функциональной переменной можно увидетьaddТип переменной функции(Int, Int) => Int, нижний слой — это объект, связанный с Lambda.

Анонимная функция, также известная как замыкание: представляет собой функцию без имени, и определенная функция используется напрямую без указания имени переменной, например(x: Int) => x + 1

Определение методов в Scala требует использования ключевого слова def, которого нет в Java, иdefДалее следует имя метода, список параметров, тип возвращаемого значения и тело метода, общий синтаксис определения метода приведен ниже.

定义方法

должны знать о том,В методах Scala по умолчанию возвращается результат последней строки оператора.. (Как и в Java, в Scala естьreturnключевое слово, но редко используется для краткости). И если тип возвращаемого значения определения методаUnit, это означает, что метод не имеет возвращаемого значения.

return

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

Далее некоторые функции, поддерживаемые в функциях/методах Scala: переменные параметры, параметры по умолчанию, именованные параметры:

1. Переменные параметры

Scala позволяет указать, что последний параметр функции может повторяться, поставить звездочку после типа параметра*, для повторяющихся параметров, используемых в Java...:

可变参数

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

2. Параметры по умолчанию

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

默认参数

3. Именованные параметры

Хотя порядок списка параметров указывается при определении функции, Scala поддерживает передачу параметров в соответствии с указанным именем параметра, а не в порядке определения.Примеры следующие:

命名参数

Контроль процесса

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

Условное суждение

Условное суждение, у Scala то же, что и у Javaif-elseсинтаксис, кроме того, Scala предоставляетсопоставление с образцоммеханизм условного суждения.

это джаваswitchОбновленная версия оператора, сначала посмотрите на синтаксис:

模式匹配

Это использует новое ключевое словоmatch, левая часть — это совпадающее значение, а правая часть содержит четыреcaseвыражения, каждое из которых представляет условие, последнееcase _означает соответствие всем остальным случаям, что-то вродеswitch-caseграмматическийdefaultэффект.

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

模式匹配2

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

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

Циклическая обработка

Синтаксис цикла Scala особенный, используйтеfor + <-для обхода элементов и обеспечения удобногоuntilметод,toспособ реализации обхода, следует отметить, чтоuntilМетод использует полузамкнутый интервал, исключая последнюю цифру индекса. иuntilметод,toНижний уровень метода заключается в создании объекта Range и последующем обходе его.

Scala  循环

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

for

своего рода

Концепция классов в Scala в основном такая же, как и в Java, но синтаксис и использование более гибкие.

Сначала посмотрите на определение класса, да, далее идет определение и использование простейшего класса в Scala, и созданUserобъект, закрепленный заuser1Переменная.

类的定义和使用

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

Конструктор

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

构造器

Здесь возникнет вопрос: если есть несколько функций-конструкторов, как должен быть определен этот класс? Давайте посмотрим на метод написания примера, основанный на исходном конструкторе, используйтеdef this(...)Определен новый метод, который выполняется внутриthis(name,age)На самом деле вызывается исходный конструктор. Scala называет этот определяющий метод вторичным инициализатором, за которым следует первичный инициализатор после имени класса.

多个构造器

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

Если вспомогательный конструктор имеет дополнительные параметры построения, вам необходимо добавить ассоциации полей, которые не будут автоматически генерировать поля, как основной конструктор.PersonКатегорияnameиage.

Переменные-члены и синтаксис получения/установки

В Java-разработке мы обычно приватизируем переменные-члены Java Beans, а затем предоставляем методы Getter/Setter для внешней манипуляции с переменными.Как это сделать в классах Scala на самом деле очень просто.Давайте сначала рассмотрим пример ниже. Члены переменных-членов по умолчаниюpublicДа, вы можете использоватьprivateМодификаторы доступа скрывают их снаружи функции.

成员变量

Обратите внимание, что объявление поля здесь использует_Ключевое слово, которое в Scala представляет значение по умолчанию определенного типа, используется для заполнителей.Если оно имеет тип String, значением является пустая строка.

отмена наследования

Наследование — одна из важных особенностей объектно-ориентированных языков, Scala также похожа на Java с точки зрения наследования.extendsи разрешить только одиночное наследование. Существует два типа наследования: один использует конструктор по умолчанию для родительского класса, а другой заключается в том, что родительский класс имеет собственный конструктор.Когда подкласс определен, он должен соответствовать требованиям параметров конструктора родительского класса, а Родительский класс будет выполнен первым.Первичный инициализатор, который выполняет собственный инициализатор подкласса.

继承

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

Trait

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

Одно отличие состоит в том, что когда классу необходимо реализовать несколько свойств,extendsМожет указывать только на одну Черту, остальные Черты нужно использоватьwithАссоциации ключевых слов, такие как примеры, приведенные ниже.

Trait

Case Class

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

Case Class

Вам не нужно использовать при создании экземпляра класса Case Classnewключевое слово, но имеет значение по умолчаниюapplyметод, отвечающий за создание объекта. И поля назначения используются по умолчаниюpublic valМодификатор, чтобы сделать поле неизменяемым.

Дополнительным примечанием является то, что когда два объекта класса Case==При сравнении Scala сравнивает по значению, а не по ссылке.

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

Scala использует только одноэлементные объектыobjectКлючевое слово объявляется отдельно, а метод определения такой же, как у класса, напримерobject Box. Но одноэлементный объект также представляет собой особый вид класса, который имеет один и только один экземпляр и создается только при первом использовании.

Сопутствующие объекты и сопутствующие классы

Scala позволяет одноэлементному объекту совместно использовать имя с классом, и, таким образом, они образуют сопутствующие отношения, одноэлементный объект становится сопутствующим объектом класса, а класс становится сопутствующим классом одноэлементного объекта. Отношение компаньона в основном отражается в том, что члены, определенные в объекте-компаньоне, могут использоваться в классе-компаньоне, как в Java.staticчлен.

carbon

Кортеж Кортеж

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

Первый взгляд на создание и использование кортежей

Tuple

Класс Tuple2 принадлежит к классам элементов, определенным в Scala, начиная сTuple2...Tuple22Всего таких классов 21, и каждый класс представляет текущее количество соответствующих параметров, то есть кортеж содержит не более 22 параметров.

Кортежи также очень удобны для доступа, сtuple._nспособ получить n-й элемент.

собирать

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

Set

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

Set

Неизменный набор часто используемых методов работы:

  • xs.contains(x),xs(x)Проверить, существует ли элемент в коллекции
  • xs intersect ys,xs & ysПересечение двух множеств
  • xs union ys,xs | ysсоюз двух множеств
  • xs diff ys,xs &~ ysразница между двумя наборами

Общие методы работы с изменяемым набором:

  • xs add xдобавить в коллекцию
  • xs remove xудалить из коллекции
  • xs.clear()пустая коллекция
  • xs(x) = b,xs.update(x, b)обновить коллекцию

Map

Характеристика коллекции Map заключается в том, что она хранится в парной структуре ключ-значение. Есть два синтаксиса:

  • key -> valueспособ добавления элементов
  • (key, value)способ добавления элементов

Коллекция Map аналогична коллекции Set, но также делится на неизменяемую и изменяемую, по умолчанию неизменяемая.

Map

Обычно используемые операции карты:

  • map.keysВозвращает повторяемый объект, содержащий все ключи
  • map.keySetвозвращает коллекцию всех ключей
  • map.valuesВозвращает итерацию всех значений
  • map(k) = vобновить элемент
  • map.put(k, v)новый элемент
  • map.remove(k)удалить элемент
  • map.clear()Очистить коллекцию карт

множество

Массивы Scala полностью соответствуют массивам Java. Массив также используется в качестве идентификатора массива.Давайте сначала посмотрим, как объявить массив фиксированной длины и легко его использовать.

定长数组

При обращении к указанному элементу массива используется форма скобки + индекс, когда элемент массива не имеет значения, используетсяnullВыражать.

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

Array Buffers

Scala предоставляет множество изменяемых коллекций контейнеров, таких как ArrayBuffer, ListBuffer, связанный список, очередь и т. д., инкапсулированных вscala.collection.mutable.*под пакет.

При использовании массива доступ будет за пределами границ.java.lang.IndexOutOfBoundsExceptionаномальный.

越界访问

Scala в действии: Scala + Spring Boot

После знакомства с таким количеством синтаксиса и функций Scala давайте воспользуемся языком Scala для написания простого веб-приложения Spring Boot для доступа к запросу приветствия и посмотрим, как оно смешивается с Java.

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

Scala 插件

мы можем пройтиstart.spring.io/Создайте обычный проект SpringBoot, загрузите его локально, разархивируйте и откройте с помощью IDEA.

На основе исходного интерфейса каталога создайте новый каталог исходного кода scala.

scala 源代码目录

После создания каталога исходного кода для Scala перейдите в файл Pom и измените конфигурацию XML:

  1. Сначала познакомьтесь с языковой библиотекой Scala, здесь версия 2.12.8.

    Scala 语言库

  2. После добавления зависимостей Scala нам также нужно добавить Maven Plguin для компиляции Scala.

    Maven Plguin

Итак, конфигурация проекта Scala завершена, и теперь можно писать код Scala.

Чтобы принять приветственный запрос, не забудьте сначала зависеть от POM проекта.spring-boot-starter-web

Создайте новый класс ScalaHelloContrroller.scala, реализация принятия/helloСпособ запроса следующий

HelloContrroller.scala

Затем запустите класс начальной загрузки проекта напрямуюcom.blog4one.learn.ScalaActionsApplication, журнал запуска выглядит следующим образом, указывая на то, что запуск прошел успешно, и служба по умолчанию прослушивает порт 8080.

启动日志

Откройте браузер и введитеhttp://localhost:8080/hello, нажмите Enter, чтобы увидеть результат.

image-20190608234156015

Успешный ответ браузера также показывает, что код ScalaHelloContrroller.scalaМожет принять и обработать ответ, при этом нижний слой по-прежнему построен на Java-фреймворке Spring Boot.

Эпилог

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

每篇一句

Ссылаться на