/Kotlin-Bootcamp-for-Programmers-Udacity

#100DaysOfCode => Kotlin

Primary LanguageKotlinMIT LicenseMIT

Kotlin-Bootcamp-for-Programmers-Udacity

Documentation

Software

  • JAVA JDK 12.0.1
  • IntelliJ IDEA Ultimate

Course Outline

  • Lesson 1: Introduction => Set up Software
    • Kotlin REPL < Ctrl + Enter > to execute

      fun printHello () {
         println ("Hello World")
      }
      
      printHello() // Hello World
  • Lesson 2: Kotlin Basics => Kotlin Koans (REPL) => Operators /
    • Operators

      // res case: kotlin.Type = ?
      
      1+1 // 2
      
      53-3 // 50
      
      50/10 // 5
      
      1/2 // 0
      
      1.0/2.0 // 0.5
      
      6*50 // 300
      
      val fish = 2
      fish.times(6) // 12
      fish.div(10) // 0
      fish.plus(3) // 5
      fish.minus(3) // -1
      
      // use primitive 'int' as an object
      1.toLong() // 1
      
      val boxed: Number = 1
      boxed.toLong() // 1
      
      // aquarium
      val aquarium = 1
      aquarium // 1
      
      aquarium = 2 // error: val cannot be reassigned => aquarium = 2
      
      var fish = 2
      fish // 2
      
      fish = 50
      fish // 50
      
      fish = "Bubbles" // error: type mismatch: inferred type is String but Int was expected => fish = "Bubbles"
      
      val plants = 5
      val fish = 2
      fish + plants // 7
      
      val b: Byte = 1
      val i: Int = b // error: type mismatch: inferred type is Byte but Int was expected => val i: Int = b
      
      val i: Int = b.toInt()
      
      val oneMillion = 1_000_000
      val socialSecurityNumber = 999_99_9999L
      val hexBytes = 0xFF_EC_DE_5E
      val bytes = 0b11010010_01101001_10010100_10010010
      
      var rock : Int = null // error: null can not be a value of a non-null type Int => var rock : Int = null
      
      var marbles : Int? = null
      var lostOfFish: List<String?> = listOf(null, null)
      var everMoreFish : List<String>? = null
      var definitelyFish : List<String?>? = null
      definitelyFish = listOf(null, null)
      
      // Error
      goldfish!!.eat()
      goldfish = null
      goldfish!!.eat() 
      
      var fishFoodTreats = 5
      return fishFoodTreats?.dec() ?: 0
    • Strings

      "Hello Fish" // Hello Fish
      
      "hello" + " fish" // hello fish
      
      val numberOfFish = 5
      val numberOfPlants = 12
      
      "I have $numberOfFish fish and $numberOfPlants plants" // I have 5 fish and 12 plants
      
      "I have ${numberOfFish + $numberOfPlants} fish and plants" // I have 17 fish and plants
      
      var fish = "fish"
      var plant = "plant"
      fish == plant // false
      fish == fish // true
      fish != plant // true
      
      val numberOfFish = 50
      val numberOfPlants = 23
      if (numberOfFish > numberOfPlants) println("Good ratio!")
      else println("unhealthy ratio")
      // Good ratio!
      
      val fish = 50
      if (fish in 1..100) println(fish) // 50
      
      when (numberOfFish) {
         0 -> println("Empty tank")
         50 -> println("Full tank")
         else -> println("Perfect!")
      }
      // Full tank
    • Arrays and Loops

      val myList = mutableListOf("tuna","salmon",shark)
      myList = mutableListOf("Koi", "goldfish") // error
      
      val myList = mutableListOf("tuna","salmon",shark)
      myList.remove("shark") // true
      
      var fish = 12
      var plants = 5
      val swarm  = listOf(fish, plants)
      swarm // kotlin.collections.List<kotlin.Int> = [12, 5]
      
      val school = arrayOf("tuna","salmon","shark")
      val numbers = intArrayOf(1,2,3)
      
      import java.util.*
      println(Arrays.toString(intArrayOf(2, "foo"))) // error: type mismatch: inferred type is String but Int was expected
      
      val mix = arrayOf("fish", 2)
      println(Arrays.toString(mix)) // [fish, 2]
      
      val bigSwarm  = arrayOf(swarm, arrayOf("dolphin","whale","orka"))
      println(Arrays.toString(bigSwarm)) // [[12, 5], [Ljava.lang.String;@43e7ca6f]
      
      val array = Array(5) { it * 2 }
      println(array.asList()) // [0, 2, 4, 6, 8]
      
      for (element in swarm) println(element) // 125
      
      for ((index, element) in swarm.withIndex()) {
         println("Fish at $index is $element")
      } // Fish at 0 is 12Fish at 1 is 5
  • Lesson 3: Functions => Run -> Edit Configurations -> Program arguments -> Kotlin
    • Main Arguments

      fun main(args: Array<String>) {
         println("Hello, world!")
      }
      fun main(args: Array<String>) {
         println("Hello ${args[0]}!")
      
         val isUnit = print("The is an expression")
         println(isUnit)
      
         val temperature = 10
         val isHot = if (temperature > 50) true else false
         println(isHot)
      
         val message = "You are ${if (temperature > 50) "tried" else "safe" } fish"
         println(message)
      }
    • Random Day

      import java.util.*
      
      fun main(args: Array<String>) {
         println("Hello ${args[0]}!")
         feedTheFish()
      }
      
      fun feedTheFish() {
         val day = randomDay()
         val food = "pellets"
         println("Today is $day and the fish eat $food")
      }
      
      fun randomDay(): String {
         val week = listOf("Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday")
         return week[Random().nextInt(7)]
      }
    • Fish Food

      import java.util.*
      
      fun main(args: Array<String>) {
         println("Hello ${args[0]}!")
         feedTheFish()
      }
      
      fun feedTheFish() {
         val day = randomDay()
         val food = fishFood(day)
         println("Today is $day and the fish eat $food")
      }
      
      fun fishFood(day: String): String {
         var food = "fasting"
      
         return when (day) {
            "Monday" -> "flakes"
            "Wednesday" -> "redworms"
            "Thursday" -> "granules"
            "Friday" -> "mosquitoes"
            "Sunday" -> "plankton"
            else -> "fasting"
         }
      }
    • Changing Water

      import java.util.*
      
      fun main(args: Array<String>) {
         println("Hello ${args[0]}!")
         feedTheFish()
      }
      
      fun feedTheFish() {
         val day = randomDay()
         val food = fishFood(day)
         println("Today is $day and the fish eat $food")
      
         shouldChangeWater(day,20,50)
         shouldChangeWater(day)
         shouldChangeWater(day, dirty = 50)
         shouldChangeWater2(day = "Monday")
      
         if (shouldChangeWater(day)) {
            println("Change the water today")
         }
      }
      
      fun shouldChangeWater(
            day: String,
            temperature: Int = 22,
            dirty: Int = 20) : Boolean {
         return true
      }
      
      fun shouldChangeWater2(
            temperature: Int = 22,
            dirty: Int = 20,
            day: String) {
      }
      
      
      fun fishFood(day: String): String {
         var food = "fasting"
      
         return when (day) {
            "Monday" -> "flakes"
            "Wednesday" -> "redworms"
            "Thursday" -> "granules"
            "Friday" -> "mosquitoes"
            "Sunday" -> "plankton"
            else -> "fasting"
         }
      }
      
      fun randomDay(): String {
         val week = listOf("Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday")
         return week[Random().nextInt(7)]
      }  
    • Compact Functions

      import java.util.*
      
      fun main(args: Array<String>) {
         println("Hello ${args[0]}!")
         feedTheFish()
      
         var bubbles = 0
         while (bubbles < 50) {
            bubbles++
         }
      
         repeat(2) {
            println("A fish is swimming")
         }
      }
      
      fun feedTheFish() {
         val day = randomDay()
         val food = fishFood(day)
         println("Today is $day and the fish eat $food")
      
         shouldChangeWater(day,20,50)
         shouldChangeWater(day)
         shouldChangeWater(day, dirty = 50)
      
         if (shouldChangeWater(day)) {
            println("Change the water today")
         }
      }
      
      fun getDirtySensorReading() = 20
      
      fun shouldChangeWater(
            day: String,
            temperature: Int = 22,
            dirty: Int = getDirtySensorReading()) : Boolean {
      
         val isTooHot = temperature > 30
         val isDirty = dirty > 30
         val isSunday = day == "Sunday"
      
         return when {
            isTooHot(temperature) -> true
            isDirty(dirty) -> true
            isSunday(day) -> true
            else -> false
         }
      }
      
      fun isTooHot(temperature: Int) = temperature > 30
      
      fun isDirty(dirty: Int) = dirty > 30
      
      fun isSunday(day: String) = day == "Sunday"
      
      fun fishFood(day: String): String {
         var food = "fasting"
      
         return when (day) {
            "Monday" -> "flakes"
            "Wednesday" -> "redworms"
            "Thursday" -> "granules"
            "Friday" -> "mosquitoes"
            "Sunday" -> "plankton"
            else -> "fasting"
         }
      }
      
      fun randomDay(): String {
         val week = listOf("Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday")
         return week[Random().nextInt(7)]
      }
      
      fun makeNewAquarium() = println("Building a new aquarium......")
      
      fun aquariumStatusReport(aquarium: Any = makeNewAquarium()){
      
      }
    • Kotlin Filters

      import java.util.*
      
      fun main(args: Array<String>) {
         println("Hello ${args[0]}!")
         feedTheFish()
         eagerExample()
      }
      
      fun eagerExample() {
         val decorations = listOf("rock", "pagoda", "plastic plant", "alligator", "flowerpot")
      
         val eager = decorations.filter { it[0] == 'p' }
         println(eager)
      
         // apply filter lazily
         val filtered = decorations.asSequence().filter { it[0] == 'p' }
         println(filtered)
         println(filtered.toList())
      
         val lazyMap = decorations.asSequence().map {
            println("map: $it")
            it
         }
      
         println(lazyMap)
         println("first: ${lazyMap.first()}")
         println("all: ${lazyMap.toList()}")
      }
      
      fun feedTheFish() {
         val day = randomDay()
         val food = fishFood(day)
         println("Today is $day and the fish eat $food")
      
         shouldChangeWater(day,20,50)
         shouldChangeWater(day)
         shouldChangeWater(day, dirty = 50)
      
         if (shouldChangeWater(day)) {
            println("Change the water today")
         }
      }
      
      fun getDirtySensorReading() = 20
      
      fun shouldChangeWater(
            day: String,
            temperature: Int = 22,
            dirty: Int = getDirtySensorReading()) : Boolean {
      
         val isTooHot = temperature > 30
         val isDirty = dirty > 30
         val isSunday = day == "Sunday"
      
         return when {
            isTooHot(temperature) -> true
            isDirty(dirty) -> true
            isSunday(day) -> true
            else -> false
         }
      }
      
      fun isTooHot(temperature: Int) = temperature > 30
      
      fun isDirty(dirty: Int) = dirty > 30
      
      fun isSunday(day: String) = day == "Sunday"
      
      fun fishFood(day: String): String {
         var food = "fasting"
      
         return when (day) {
            "Monday" -> "flakes"
            "Wednesday" -> "redworms"
            "Thursday" -> "granules"
            "Friday" -> "mosquitoes"
            "Sunday" -> "plankton"
            else -> "fasting"
         }
      }
      
      fun randomDay(): String {
         val week = listOf("Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday")
         return week[Random().nextInt(7)]
      }
      
      fun makeNewAquarium() = println("Building a new aquarium......")
      
      fun aquariumStatusReport(aquarium: Any = makeNewAquarium()){
      
      }
    • Kotlin Lambdas

      import java.util.*
      
      fun main(args: Array<String>) {
         println("Hello ${args[0]}!")
         feedTheFish()
         eagerExample()
      }
      
      // Run REPL
      /*
      { println("Hello") }()
      val swim = {println("swim \n")}
      swim()
      */
      
      fun swim() {
         // swim
      }
      
      fun eagerExample() {
         val decorations = listOf("rock", "pagoda", "plastic plant", "alligator", "flowerpot")
      
         val eager = decorations.filter { it[0] == 'p' }
         println(eager)
      
         // apply filter lazily
         val filtered = decorations.asSequence().filter { it[0] == 'p' }
         println(filtered)
         println(filtered.toList())
      
         val lazyMap = decorations.asSequence().map {
            println("map: $it")
            it
         }
      
         println(lazyMap)
         println("first: ${lazyMap.first()}")
         println("all: ${lazyMap.toList()}")
      }
      
      fun feedTheFish() {
         val day = randomDay()
         val food = fishFood(day)
         println("Today is $day and the fish eat $food")
      
         shouldChangeWater(day,20,50)
         shouldChangeWater(day)
         shouldChangeWater(day, dirty = 50)
      
         if (shouldChangeWater(day)) {
            println("Change the water today")
         }
      }
      
      fun getDirtySensorReading() = 20
      
      fun shouldChangeWater(
            day: String,
            temperature: Int = 22,
            dirty: Int = getDirtySensorReading()) : Boolean {
      
         val isTooHot = temperature > 30
         val isDirty = dirty > 30
         val isSunday = day == "Sunday"
      
         return when {
            isTooHot(temperature) -> true
            isDirty(dirty) -> true
            isSunday(day) -> true
            else -> false
         }
      }
      
      fun isTooHot(temperature: Int) = temperature > 30
      
      fun isDirty(dirty: Int) = dirty > 30
      
      fun isSunday(day: String) = day == "Sunday"
      
      fun fishFood(day: String): String {
         var food = "fasting"
      
         return when (day) {
            "Monday" -> "flakes"
            "Wednesday" -> "redworms"
            "Thursday" -> "granules"
            "Friday" -> "mosquitoes"
            "Sunday" -> "plankton"
            else -> "fasting"
         }
      }
      
      fun randomDay(): String {
         val week = listOf("Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday")
         return week[Random().nextInt(7)]
      }
      
      fun makeNewAquarium() = println("Building a new aquarium......")
      
      fun aquariumStatusReport(aquarium: Any = makeNewAquarium()){
      
      }
      
      var dirty = 20
      
      val waterFilter: (Int) -> Int = { dirty -> dirty/2 }
      fun feedFish(dirty: Int) = dirty + 10
      
      fun updateDirty(dirty: Int, operation: (Int) -> Int): Int {
         return operation(dirty)
      }
      
      fun dirtyProcessor() {
         dirty = updateDirty(dirty, waterFilter)
         dirty = updateDirty(dirty, ::feedFish)
         dirty = updateDirty(dirty, { dirty -> dirty + 50 })
      }
      
      // REPL
      /*
      val list = listOf(1, 2, 3)
      list.filter { it == 2 }
      */