Scala: Difference between revisions

From bibbleWiki
Jump to navigation Jump to search
Line 104: Line 104:
<syntaxhighlight lang="scala">
<syntaxhighlight lang="scala">
val plusOne = (x: Int) => x + 1
val plusOne = (x: Int) => x + 1
</syntaxhighlight>
We can use the name function above with
<syntaxhighlight lang="scala">
plusOne(99)
</syntaxhighlight>
</syntaxhighlight>


=VS Code=
=VS Code=
I used https://shunsvineyard.info/2020/11/20/setting-up-vs-code-for-scala-development-on-wsl/ for installing with VS Code.
I used https://shunsvineyard.info/2020/11/20/setting-up-vs-code-for-scala-development-on-wsl/ for installing with VS Code.

Revision as of 12:05, 11 January 2021

Introduction

Some features of the language

  • Functional and Object Orientated
  • Use of immutable Data Structure
  • Rich Collections Library
  • Better Concurrency Support

To get this to work I downloaded scala and intellij.

Functional Programming

Some definitions

  • Immutability is when we can not allowed to change a variable. Not changing a value means parallelism will work better
  • Expression are something yields a value. e.g. x+y and have not side effects
  • Statements is code which does something. e.g. do(something) and have side effects
  • Function is a a relation between a set of inputs and a set of outputs with the property that each input is related to exactly one output.
    • Pure always has the same output, easier to test, parallelisation
    • Impure may not have the same output

High Order Functions

High Order Functions are function which take functions as an argument High Order functions allow you to provide some of the method as an argument to extract the part which is different
So given the following to get apples

def getApples(basket: List[Fruilt]) = getFruits(fruitBasket,
  (fruit: Fruit) => fruit.name = "apple")


Can be replaced with a more generic

def getFruits(basket: List[Fruilt], filterByFruit: Fruit => Boolean) = 
    for (fruit <- basket if filterByFruit(fruit)) yield fruit


Scala provide many other HOFs not KnightRider such as

  • map
  • reduce
  • filter
  • fold

Language Features

val and var

Like Kotlin, scala supports val and var where only vars can be changed

Conditions

If conditions are expressions and not statements. We generally do not need the return statement. I think this is like Ruby from memory e.g.

val arguments = Array("Monday")
val day = if (!arguments.isEmpty) arguments(0) else "Sunday"

Loops

Imperative

Where we do something

val letters = List("a","b","c","d","e")
for(letter <- letters) {
   println(letter)
}

We can add filters on the end e.g. to print even numbers

for(letter <- letters if (number %2) == 0) {
   println(letter)
}

And not just one, many, which I think is looking really really ugly

for(
 letter <- letters 
 if (number %2) == 0) 
 if (number > 2) 
{
   println(letter)
}

We can iterate within an iteration though using the same approach e.g. we could have

for(number <- numbers) {
  for(letter <- letters) {
     println(number + " => " + letter)
  }
}

But with the new way this could be written with curly braces

for{ 
  number <- numbers 
  letter <- letters 
 } println(number + " => " + letter)

Functional

Where we return values. Using the example above we could yield a List[String] of values.

for{ 
  number <- numbers 
  letter <- letters 
 } yield number + " => " + letter

Functions

Introduction

Functions are very similar to other languages

def foo(arg: Type): ReturnType = {
  // Stuff
}

Anonymous Functions

Scala supports this e.g.

val plusOne = (x: Int) => x + 1

We can use the name function above with

plusOne(99)

VS Code

I used https://shunsvineyard.info/2020/11/20/setting-up-vs-code-for-scala-development-on-wsl/ for installing with VS Code.