Basics of Scala
How to use scala ?
- you should have 
jvminstalled. - download scala binary form the scala official website
 - it comes with a repl
- read execute print loop
 
 
- some tools also help you set up scala for the system
 sbt- scala built tool is one of them- it is a build system
 - help to manage dependencies for the scala project
 
Hello World
object HelloWorld extends App {
  println("Hello, World!")
}
- singleton object, no need of class like in java
 - compile it with 
scalac helloworld.scala - run it with 
scala HelloWorld scala -efor interactive mode, and scripting
var and val
varfor variables whose values will be changed -mutablevalfor variable whose value will not be changed -immutable
Objects
- object have states and behavior
 - instance of a class
 
syntax:
object obj-name{
}
Methods
- behavior
 
def functionName ([list of parameters]) : [return type] = {
  //function body
  return [expr]
}
def printHello(){
}
Field
val name = "Shivanshi"
var age = 11
Initialize Variables
var varname = values
var varname:Type = value
varname: Type = value
Conditionals
object demo{
  def isEven(s:Int):Boolean = {
    if(x%2==0) true
    else false
  }
}
Loops
- while loop is supported
 
val i = 0;
while(i<10){
  println(i)
  i = i+1
}
- for loop is supported but with some changes, and diff syntax
 
for(i <- 1 to 10){
  println(i)
}
- nested loops in one line
 
for(i <- 1 to 10; j <- 1 to 100)
  println(i + ' ' + j)
same as
for(i <- 1 to 10){
  for(j <- 1 to 100)
    println(i + ' ' + j)
}
- do while loop is not supported
 
Data types in Scala
all java data types are supported
Byte,ShortIntLongFloatDoubleCharBooleanString
and some additional types
Unit- no value, equivalent ofvoidinjava
~
Null- null or empty referenceAnyRef- a supertype of any reference
~
Nothing- a subtype of every other typesAny- a supertype of any type
for object
Any -> ... -> Nothing
for references
AnyRef -> ... -> Null
Difference b/w null Null Nothing Unit Nil None
null- literal, a valueNull- a subtype of all reference types
~
Nothing- It doesn't have any methods or values
 - extends the Any type
 
~
Nil- empty list -List()
~
None- subtype of Option type, opposite ofSome
~
Unit-voidempty return type
Types of Functions
first order
- don't take functions as arguments
 
higher order
- take functions as arguments
 
nested functions
Define function inside another function.
def factorial(x:Int):Int = {
  // making a nested function
  def fact(i:Int, acc:Int):Int = {
    if(i<=1) acc
    else fact(i-1,i * acc)
  }
  fact(x, 1)
}
anonymous
- Anonymous functions in source code are called function literals
 - and at run time, function literals are instantiated into objects called function values
 - Scala supports first-class functions
- which means functions can be expressed in function literal syntax,
 - i.e., 
(x: Int) => x + 1 - and that functions can be represented by objects
 - which are called function values
 
 
e.g.
- with one parameter 
var inc = (x:Int) => x+1 - with two parameter 
var mul = (x: Int, y: Int) => x*y - with zero parameter 
var userVal = () => { 345 },println(userVal()) 
Closures
- a function, whose return value depends on the value of one or more variables declared outside this function.
 - variable declares outside the function is called - free variable
 - variable in the definition is called bound variable
 
e.g.
val more = 10 // free variable
var y = (x:Int) => x + more // x-> bound variable
- the function value (the object) that’s created at runtime from this function literal is called a closure
 
tail recursion
- recursion at the end
 - use 
@tailrecannotation 
@tailrec def factorial(x:Int, acc:Int):Int = {
  if(n<=1)
    acc
  else
    factorial(x-1, acc*i)
}
input in scala
var a = scala.io.StdIn.readInt()
var b = scala.io.StdIn.readDouble()
var c = scala.io.StdIn.readLine()
try-catch exceptions
try {
  doSomething()
}
catch {
  case ex: IOException => println("Oops!")
  case ex: NullPointerException => println("Oops!!")
}
finally{
  println("this will execute every time even if code terminates in middle")
  println("so close files here")
}
match
val first = "chips"
first match {
  case "salt" => println("pepper")
  case "chips" => println("salsa")
  case "eggs" => println("bacon")
}
def doChore(chore: String): String = chore match { 
    case "clean dishes" => "scrub, dry"
    case "cook dinner" => "chop, sizzle"
    case _ => "whine, complain"
}
Different Types Of For Loops
- with single range
 
for(i <- 1 to 100){
  println(i)
}
- with multiple range
 
for(i <- 1 to 10; b <- 1 to 10){
  println(i+j)
}
- with collections
 
for(i <- List(2,3,5,6)){
  println(i)
}
- with filters
 
for(
  i <- List(1,3,4,6,7)
  if i !=3; if i!=4
) {
    println(i)
}
- with yield
 
var a =
  for (
    i <- List(1, 2, 3, 4)
    if i != 3; if i != 4
  ) yield i