Рубрики
Без рубрики

5 Синтаксических советов и рекомендаций Scala

Scala – это совершенно особый язык. Ваши начальные строки кода, особенно если вы знаете Java, довольно просты… Помеченный scala, jvm, java, функциональный.

Scala – это совершенно особый язык. Ваши начальные строки кода, особенно если вы знаете Java, довольно просты. Но, углубившись во все скрытые сверхспособности языка, легко полностью заблудиться. В этом посте я представлю вам некоторые из самых крутых синтаксических шаблонов, с которыми я столкнулся, читая код Scala и работая с некоторыми учебными пособиями, найденными в Интернете. Я надеюсь, что это поможет вам перейти от хорошего к великому в Scala development. Наслаждайтесь!

#1 Вызов методов с одним параметром

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

def saySomething(sentence: String): String = "I say $sentence"

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

val sentenceSaid = saySomething("it's sunny today")

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

val sentenceSaid2 = saySomething {
  // add some more expression
  "it's rainy today"
}

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

#2 Одиночный абстрактный метод

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

trait Action {
  def act(x: Int): Int
}

Как правило, вы создаете класс, который реализует эту черту, а затем переопределяете метод с желаемой реализацией или реализуете анонимный класс, подобный этому:

val instance: Action = new Action {
  override def act(x: Int): Int = x % 2
}

Что делает единый абстрактный метод, так это позволяет уменьшить анонимный класс, как указано выше, до lambda . Эта реализация выглядела бы примерно так:

val lambdaInstance: Action = (x: Int) => x % 2

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

#3 Именование метода из нескольких слов

Это на самом деле очень, очень круто, чтобы показать, на что способна Scala:) В стандартном соглашении об именовании вы, вероятно, начинаете со строчного слова, а затем начинаете добавлять более конкретные слова в верхнем регистре, чтобы создать имя для метода. Но есть более приятный способ сделать это. Давайте предположим, что у нас есть такой метод, как этот:

def engineHpToKw(horsepower: Int): Int = horsepower * 0.74

Описанный выше метод довольно стандартен и совсем не интересен. Что интересно, мы можем сделать, так это написать его название в виде нескольких слов, вот так:

def `calculate engine kilowatts from horsepower`(horsepower: Int): Int = horsepower * 0.74

Приведенный выше выглядит очень круто и может стать очень полезным, когда трудно найти краткое название для метода. Обратите внимание, что слова заключены в обратные тики (`), а не в одинарные кавычки. Вызов такого метода выглядит следующим образом:

val kw = `calculate engine kilowatts from horsepower` 120

#4 Типы инфиксов

Инфиксные типы могут быть очень полезны при работе с generic на языке Scala. Допустим, у нас есть такой код, как этот:

class Composite[A, B]
val composite: Composite[Int, String] = ???

Что позволяют нам делать инфиксные типы, так это изменять значение composite выше на что-то вроде этого:

val composite: Int Composite String = ???

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

#5 Последовательности и операторы

Последний бит, вероятно, более очевиден, чем другие. В классе Sequence довольно много классных операторов, которые могут ускорить работу с коллекциями. Тогда давайте посмотрим:

val letters = Set("A", "B", "C")

// Append element
val lettersPlusD= letters + "D" // letters = Set("A", "B", "C", "D")
// Remove element
val lettersMinusC = letters - "C" // letters = Set("A", "B", "D")

val lettersTwo = Seq("E", "F")

// Concatenate two sequences
val lettersCombined = letters ++ letters2 // Set("A", "B", "D", "E", "F")
// Prepend an element to sequence
val lettersCombinedWithG = "G" +: lettersCombined // Set("G", "A", "B", "D", "E", "F")
// Get intersection between two sequences
val commonLetters = letters & lettersCombinedWithG // Set("A", "B")
// Get difference between two sequences (elements in the first sequences that are missing in the second one)
val difference = letters &~ lettersCombinedWithG // Set("C")

Подробнее можно найти здесь .

Резюме

Я надеюсь, что вы нашли этот пост полезным. Если да, то не стесняйтесь ставить лайк или делиться этим постом. Кроме того, вы можете следить за мной в моих социальных сетях, если вам так нравится:)

Оригинал: “https://dev.to/bartoszgajda55/5-scala-syntactic-tips-tricks-1n5h”