kotlin is the most popular programming language for building Android apps and it can also do a lot of other things in this beginner's course Alex will teach you kotlin from the ground up Alex is an experienced developer who has created multiple Android apps in this course I'll cover everything you need to know in order to be able to create another programs or move to build apps on Android I will start from zero by downloading the software that we need to write code to creating our first program and then we're gonna move to more advanced topics we'll cover things like variables operators Loops arrays object orientated programming generics Lambda functions core routines everything will be covered in depth with great detail additionally I'll use beautiful animation while talking about a concept for who is this course this course is for complete beginners who have no experience with programming and also for experience programmers kotlin is perfect for beginners because it's very intuitive and concise and if you already have a background in other programming languages then this course would be easy for you so let's get started now it's time to download the installing ID and throughout this course I'm going to use an ID called IntelliJ ID which is an ID made by a company called jetbrains now you may be wondering what is an idea an IDs stands for an integrated development environment and it's basically the tool that you're going to use writer code in and intelligent it's like a text editor but a very sophisticated one because it has a lot of features like highlighting our code showing real-time errors and suggestions you can run and compiler coaches by a few clicks in other words it's making the process of writing code easier and better therefore let's download IntelliJ IDEA so I'm going to open my browser and in the search bar to type IntelliJ IDEA press enter and we click on this download link and on the downloading page you're going to see two options ultimate which is paid so you need to pay in order to download it and Community which is free and the difference is that the ultimate has more features and Community has less features but Community is not for our purposes also pay attention on the left hand side when I'm currently recording this video the latest version is 2021.1.2 which was released on the 1st June of 2022. and if you look at the system requirements here if you click on that you will see that this IntelliJ ID only works for a 64-bit version of Windows so if you have a 32-bit version of Windows this will not work for you now if you have macro X or Linux you should download the particular version for your system and if you don't know how it just tell me in the comments and I've made two separate video and shall show you how to do now I'm gonna download the community version for Windows so click to download the community now our downloading is starting on the right hand side on the top and if you have a different browser you'll see this in an infrared place so once the downloading is finished just open this file I'm going to close the browser now because I don't need the browser and the installation will start immediately now it's asking us if you allow this app to make changes to a device click yes you need to click on next this is the for the location or IntelliJ is going to be installed you can keep the default location or you can change it if you want I'm going to keep the default location so I'm going to click on next and here I'm going to check this box to have a desktop shortcut I'm going to click on next now I'm going to click on install and IntelliJ is going to be installed on my computer as you can see on the left hand side IntelliJ already appeared now let's wait until the installation finishes when the installation finishes just check this run Intel GID Community Edition and click on finish now intelligently IntelliJ is going to open now it's asking us if you want to import IntelliJ settings so if you have the previous version of IntelliJ ID you can import the settings here but I'm going to click the not import settings and click on OK now IntelliJ ID is going to open and this is the welcome window of IntelliJ IDEA and here on the left hand side click on customize go here to where it says color theme so you can change this theme because the default team is this dark team I'm Gonna Change it to light because the IntelliJ team is better for tutorials but you can keep the dark team if you want and in a separate video I'm going to show you how to add more themes not just the ones provided by IntelliJ ID now click back on projects click on this plus button where it says a new project because we need to configure the jdk now and now here we have jdk and we have in red and angle brackets we have no JD no SDK and now here we need to add the jdk and jdk stands for Java development kit SDK stands for software development so software developer Kint is the Java development kit no matter how you call it this thing contains the tools that IntelliJ ADN needs in order to be able to compile and run our programs because without them IntelliJ edits like an empty text editor so it needs those tools in order to be able to work with our particular programming language which is kotlin now to download the jdk and we use the Java developing kit because code and Java are interoperable and that means that you can use the existing Tools in library which Java already has in our kotlin project so quickly here on this no SDK and click here where it says download jdk now on this window we select version 17 not version 18 because this is the latest version 18. this change version 17 because this is the version which has the long-term support and that means that it will receive bug fixes and updates for several lists to come without you needing to switch to any new version when that new version is released for the average vendor we choose Amazon Creator and I'm gonna let the default location so I'm gonna click download to download the jdk now the jdk is going to be downloaded now the jdk has been installed and is installed on our IntelliJ IDEA and now we can create our projects but I'm not going to create a project so I'm not going to click on create I'm going to click on cancel and in the next video we're going to create our first project and we're also going to talk about a little bit the jdk and the jvm so see you in the next video now it's time to create our first project and there is a traditional programming that our first program should be to Output the text tail over to the console and this is what we're gonna do in this video therefore I'm going to open IntelliJ ID you should open your IntelliJ IDEA on the left hand side make sure to have project selected then click on this plus button to create a new project and here we have a few options the first is the name and here you need to name our project we need to give a name to our project and the name of the project should start with the capital letter and if it has multiple words every word should start to the capital letter so I'm gonna call this uh on on this the way of naming is called the Pascal case so I'm going to call this uh this project hello world and also you should not have y spaces in your name next we have the location and this is where the approach is going to be created you can change this location if you want but I'm going to keep the default location next we have language and here you can here you need to select the language which this project is going to be created so we select Catalan if you Java is selected just select other B system we select IntelliJ and next we have the jdk the Java development kit and if for a terrible reason it says here in angle brackets no LDK just click on that and go down here off down off to afternoon it should say detected as jdks and you will see the jdk down there you're going to see Amazon correct or version 17. just click on that and it's going to be added here next we have this add sample code and what this is going to do as the naming price is gonna generate some code for us but I don't want to have that code generated uh now because I want to that type that code myself and I want to explain that code then in the next video we're gonna check that to generate the code for us so I'm gonna click on create Now to create the project and here we have the tips you can keep the tips activated because it's uh useful information but I'm gonna check this actually I'm gonna just close it here we have those windows which says there is a that is a plug-in update installed I'm going to close this so what we have now on the left hand side is called the project Pane and here we have some folders which IntelliJ IDEA generated for us but now I want to I want to show you how to check for IntelliJ updates because in this way we'll have the latest features throughout this course and to check for IntelliJ updates you go to help and to go down here where it says check for updates and here you can check for IntelliJ updates and you'll see a window down here and if there is an update it's gonna say that that there is an update and you can install that that update but now it's saying that that you already have the latest version of IntelliJ ID and plugins installed because we have the latest updates but it's good to check for this because in this way we'll have the latest updates so throughout this course next just check if you want to check for kotlin updates so for the programming language you kotlin you go to tools kotlin and go here it says configure custom plugin updates and if there is a new update you will see it here and click on install and that update is going to be installed on IntelliJ IDEA so there is no update because we have the latest update I'm going to click on OK now let's focus on the left hand side and if you don't see if you see something like this and you don't see this in this expanded form just click on this greater sign sign in front of his SRC SRC stands for Source this is where our source code is gonna go then click on this greater sign in front of Main and make sure to have the folder kotlin selected on this folder kotlin this is working out our code but first we need to create a file and the file is the thing where we're going to put our code so we right click on this go to new and here we select on the right hand side we select quoting class file now we need to give a name to our file and I'm going to call this file main you'll see the reason for this later so I'm going to call this file Main and then also you should be in Pascal case so if you start with the capital letter and if it has multiple words every words result the capital letter and for the from these options that we have here we select file because we're going to create a setup file now press enter now the file was created for us as you can see in the folder uh kotlin now we have main.at have the file and also to open the file for us let's uh click there now if you don't have the file open then if you have something like this just double click on the file and the file is going to be open for you now here now we're gonna type some code now you need to type exactly what I type so type fun so while I am typing as you can see IntelliJ is trying to help us and is giving us some suggestions so he's saying do you mean fun that and if you want to fill in that photo you just press enter Because I want to to to type that fun keyword fun and it also added the space so fun space then you type Main and next we need to put parenthesis and as you can see display button now appeared I'm going to explain immediately why and we put the left parenthes and when we put the left parenthes the right parenthesis is going to be added automatically so you put less parenthes and the right parenthesis was added automatically then we get outside of the parenthesis we press space now we're going to add curly braces and again we put the left calibrates and the record library is going to be added automatically because IntelliJ is helping us now we would inside the curly braces and now we press enter and it uh added the curly brace on the third line and also indented this line for us now let's talk about what we have here now what we have here is what is called the main function and the main function is the entry point of our program so every program that you create it if it first needs this entry point in order to be able to compile your code but let's take each part of this main function individually to talk about so first to have this fun and fun is the key word for creating a function and uh you can use fun keyword to create your own functions but you're gonna see that in uh in future videos next we have Main and Main is the name of this function functions can have different names but main is a special one as I said because main is the entry point of our program every program that you create needs and needs a main function in order to be able to run your code and in fact if I change the name of this function to fun main let's say a the play path button immediately disappear because now we don't have an entry point and our program can run so this is a special function and functions can have different names as I said and as you'll see we're gonna create your own functions that you can create you can give different names to your functions now next we have parenthesis and you have parentheses because um functions can take parameters and can do some work with that with those parameters but our function doesn't take any parameter but we still need to provide the parentheses because they are part of the syntax and we can think of the syntax like the grammar rules that you need to to to respect in a specific language in order to be to be a to under to be understood to be understood and in the same way this is the syntax in the programming it's like the grammar rules in which the compiler as you will see what is the compiler later the compiler needs enforces you to respect those syntactical rules which is uh to have parenthesis for a function in order to be able to understand your code because if I delete the parenthesis here now we have an underline which says uh expecting parentheses so it's it's it it you need to respect the syntactical rules in order for your code to be to be understood next we have curly braces and we have left curly brace and right curl base and this is called the body of the function so this is where our code goes so this is also called the code block because because it's the block of code this is what our logic our uh our these are our logic our lines of code go they are we Define them inside the the the curly braces so this represents the body of the function and let's add some code and I'm going to type print line here so because when we need to output something in the console so we type here print line so we type print and while I'm dumping you associate suggested and we have the suggestion print line and we select the first one to fill in for us and now we go inside the parenthesis of the print line and we put double quotation marks and inside the double quotation marks we type hello world now we need to we need to run this code in order to run this code to compile this code we can do it in uh two ways first you can click on display button that we have here or you can right click and you can go here where it says runmen.kt and the code is going to be compiled and let's do it from here first so I'm going to click on display button to run our code and I'm going to see the console opening down and you're going to see the text hello old hello world outputted so the console opened and we have hello world we have the text that we type inside this uh thing that we have here this also function and we have this code output now in the console the console opened now I'm gonna I'm gonna close the console to explain what this print line is this print line that we have here is a function also but is that the function which takes some which takes input and the input is this text and this function the its job is to take whatever you pass as the input and to Output that in the console so this is what this print line is doing and this is a function that we didn't create we didn't type free fun print line and then you call it this is a function which is uh build into quantity this is a function which is already built by the kotlin programmers so we just call that function inside our code and we can use you need you don't need to create this function so this is the this is what this print line is doing so it's taking whatever you pass inside the parentheses and it's outputting that in the console so this is our discussion uh about uh the first program which is to Output some text in the console hello world and uh now I'm gonna show you that I know I'm going to show you an illustration to understand what is uh what is the jdk the jvm and the how kotlin and Java achieves this interoperability because Kathleen and Java are fully interoperable and that means that you can have a Java project which you can add kotlin code and you can compile that code and everything to work fine and also I'm going to explain what the what the word compile means and for that I'm going to bring an illustration here so this is the illustration and uh let's talk about what we have here first we have kotlin source code and kotlin source code is the code that we wrote is this squad that is meant to be human readable so this code is the code that we as humans can understand we can write this code we can read this quad but the computer does understand this high level uh high level uh quote that we wrote it needs something it need it needs machine code it needs binary code in order to be able to understand and this is where the jdk comes into action so our continent source code again this quad which is meant to be human readable then it's when when we press on that play button on that and when you press on that play button on this button and the code is compiled what happens under the hood is that that quoting source code is is uh taken by the Java development kit the jdk and through the kotlin compiler so the controlling compiler acts like a translator it takes that high level human readable and writable code it converts that code then into what is called Java byte code and this is not the final step as you can see in this illustration this this is just the intermediary step this is not uh converted into machine code then this Java byte code it's uh taken by the jvn so it's sent to the jvm and the jvm then takes that Java by code and convert the jbox.java by code into something which a machine which a specific machine can understand but let's let's first explain why why kotlin uh why the jdk takes this kotlin source code and then it converts this kotlin source code into Java byte code and this is doing this because different processors and if different operating systems need different instructions in order to understand your code so if we are not will not to have this Java byte code so if we had we'll uh compile our code on a specific platform that code can run only on that specific platform but because our quadrant source code is taken by the jdk and through the quarterly compiler and is converted into Java byte code and the Java byte code then it's it's uh it it's send it to the jvm and jvm stands for Java virtual machine and the jvm then because different platforms and different operating uh different platform and different processors need different instructions the jvm is the one which is doing the hard work of figure out figuring out what kind of instruction that specific platform needs so it converts that Java by code into machine code let's say which a Windows platform can understand then the same thing happens to Linux the J the jvm receives the same Java byte code and then it converts that Java by according to machine code which a Linux platform can understand and then is doing the same thing to a Mac OS so the make waves the jvm is gonna is gonna receive the same Java byte quad and it's going to convert that Java by code into machine code which Macos can understand so this is how uh kotlin and Java can achieve this call this thing called Write once and run everywhere this is because the the work of converting that machine code which which a specific platform Cananda said has shifted from the programmer to the platform which has the which implements that jvm so we just wrote Our quad we run our code through the jdk the jdk converted that code in Java byte code and then the platform which has the jvm installed uh it's doing the work of converting that Java by code that we wrote into something which that platform that specific platform can understand so and this is why uh Java and Kathleen are fully interoperable so you can add you can add Java code to an existing kotlin program and vice versa you cannot uh you can add the Java you can add the quota link code to an existing Java program and that is uh that is possible because uh the jdk is gonna is gonna convert through the compiler all of that code into the same Java by code and then that code is going to be run on the jvm and the jvm is going to convert that into machine code and that code is going to run on a specific platform so this is how Java and kotlin and this is why Java and collecting and are fully interoperable because they uh their core they are ultimately converted into the same Java by code and you can also achieve this right once run everywhere because that code then runs on the jvm Java virtual machine which is doing the hard work or figure out what kind of instructions uh specific platform needs in order to understand that code that we wrote and in this way that hard working has shifted from us to the people who implement the jvm so this is how the jdk and The jvm Works under the hood and if you find this confusing don't be just this is just a relaxed discussion about uh how the jdk what is the jdk and what is the kotlin compiler because I said our cotton I said previously that our code is compiled when I said that this actually what was happening our code was taken by the jdkn through the jdk was covered in Java bytecode then it was sent to the jvm of uh which is on my windows and then that is converted into machine code and then we see in the output hello world so this is our discussion about the first program how to create the first program hello world and this is the additional discussion about how the jdk how the quartering compiler and how the jvm works so see you in the next video so in the previous video we created our first program and even though it was a simple program you should celebrate because you created your first program but if you want to make your program to do something useful you need to store data and in order to store data we need to use variables and this is what we're gonna talk about in this video therefore I'm going to open IntelliJ IDEA I'm gonna create a new project so make sure to that on the left hand side you have project selected click on this plus button to create a new project I'm going to call it variables it should be in Pascal case if it has multiple words language we have already constantly selected for the build system IntelliJ and also make sure to have the jdk selected here and now I'm gonna check this out sample code because this is going to generate the code that we typed previously respectively the main function and the print line to and the hello world text is going to be now Auto generated for us by because we check this box add sample code and it's going to add the code automatically for us so I'm going to click on create now our project is ready to go and as you can see here it generated some code for us and this is similar to what we've did in the previous video where we created our we'll create our code ourselves but we have some additional code and uh I'm gonna delete this additional record because it will make things confusing so I'm going to delete this part sorry I'm gonna delete this part and also uh you have may have noticed that uh here in inside this parenthesis we now we have this args array and string we can delete this too because it will make I think things confusing and we're going to talk about what are the arrays and all of that in the next videos now I'm gonna all right now ready now let's run this code to see to see what is happening it's gonna output that text like it did in the previous video you should open the console in a short moment and indeed it opened the console and it output the text hello world like it did in the previous video so I'm going to close the console now also let's expand this SRC to see the file that it was created automatically for us this time and um let's change this hello world text to print another text let's say let's print the type your name there in my case is Alex so I'm going to run this quad and it will output my name in the console all right so it outputted Hello Alex like we typed here but um it's what we have here is pretty pretty inflexible it's a better way to be to to do that it will be to have something to store this name and then refer that that thing here to call that thing here and this will be a bit more more dynamic and to do that we need to use variables and variables are are like some containers which can hold data values and let's see how to create a variable okay Let's uh put the the the code below above our print Ln statement and if you don't know what a statement is a statement is of complete instruction of execution Now to create a variable we just type the keyword far which stands for variable all right next we need to give a name to our very a variable to be able to refer it later to call it later and I'm going to end the naming convention around the naming variable is called is called camel case and that means that the first letter in the name if it has multiple words so start with the lowercase letter so I'm going to type user and the next word name with the capital letter all right next we need to provide the type of the variable and that means what kind of data this variable is going to hold it's going to store to do that we need to put colon and next we need to say what type of data is going to store what what data is going to store and we want to store text and to store text we need to type here string and string means that this variable is going to store a single a sequence of characters or text now we need to assign a value to this variable and to do that we'll put we put here equals space and because we express the cells here that we're going to put text text or string we put a double pair of quotation marks and we type Alex all right so now we create our variable we give it a name a type and with with also sine of value to this variable next we need to refer this variable down here and to to to refer that variable I'm going to delete this text first and to refer the variable we put dollar sign and after the dollar sign we start typing the name of the variable user and as I'm typing the IntelliJ is giving us some suggestions and it said do you mean this username variable and it also has this V here for variable so I'm going to press enter to fill in that for me and if I run this code you'll see the exact singer Happening Here It outputted the text Hello Alex but this time we didn't type the text directly here which we we stored the text in a variable and we call that variable in uh in our printerland I'm going to add a space here to make things more clear now what we can do is to change the value of this variable by adding below of our variable typing the name of the variable again user name equals and now we can assign a new value to this variable and let's put let's put John here all right let's run this code to see what happens now now this time when this uh this instruction is going to be called it's going to print then the new value of the variable which is John so as you can see down here it output the text hello John so we can change the value of the variable after we assign a value to it but what you can't do is to is to type here username equals 5. and if you hover over here it says integer literature does not conform to the specific type string and in other words it's saying that we said explicit explicitly up here that is gonna store only text and down here we try to put a whole number an integer and that is not going to work because kotlin is a link language which is uh which is called statically typed and that means that it it will check the types of the variable at compile time not at run time and that means it does it you cannot run your code if you assign um a value to to a variable which has a different type that done done the type that you specify specified when you record the variable this is why we get this warning here and if I delete this now let's delete this all right okay the next type of variable that also actually not the next type the word over the next way of declaring a variable is using the keyword file so if you declare if you declare a variable as Val Val means that we cannot change its value after we assign a value to it so if you try if you try to assign a new value to our variable like we did here up here it will not work so let's actually let's actually just change here let's put Val okay and and after I did that you it immediately underlying red username and it says Val cannot be reassigned and that is because if you declare if you declare a variable as Val you cannot change its value later it will you can put a value to that variable only once and that's all we cannot change the very the value of the variable later so let's change this back to VAR to have the ability to change the value now let's look at another type of variable so I'm gonna type VAR again I'm going to call it age I'm going to put colon to specify a type here and now we're going to use another type which is int and int stands for integer or for whole numbers now we need to assign a value to it I'm going to call I'm going to put you know 10 or you know 20 22 all right so what we have now is a different type up here we have string and that means that we're going to we're going to store sequence of characters and down here we have integers and that means that we can store um only only numbers only whole numbers and there are different type of numbers which you're gonna look in the next video and if I try here to change this uh to change this so first first let's let's actually let's actually print this uh Hello Alex let's type your age is and here you put dollar sign and we call uh the name of the variable without the name of the variable age so we press enter to fill in that for us and if you run this code now says hello John your age is 22. so now it's using the value the values of this variable in our printerland and we can change for the variable also the its value because it's declared as a VAR not a Val so we can put here age equals let's say 25 and if you run this code the change is reflected immediately in our code so now we see hello John your age is 25. what we can't do like in the previous example with the username Here We cannot put a string We cannot put hit Alex because we said explicitly here that this is gonna is gonna hold only integers only whole numbers so I'm gonna delete this let's put it again to 25 and the arrow error disappeared all right now let's look at what we have here because we have this underlines this uh uh great light out of our types and every time you see something like this that means that IntelliJ is trying to say something to you and if you hover over here actually let's hover over over the type it says explicitly given type it's redundant here and that means that uh it does not need to we we don't know we don't need to say explicitly here that is gonna hold of um sequence of characters it's going to hold string because it knows this you can because it quoting has something which is called type inference and that means that it can infer the type of the variable by the value we assigned to it in our case we assign some text so if I delete the type here now is still working and if I as you can see if I if I put here let's say if I try to put your username sorry username equals to tree is still treated as a string because it inferior it it inferred the type by the value assigned to it and similarly this uh this thing applies to to our int type so if I delete this is still working it's tilt it and it is still treating this as a as an end so if you try to put here age equals to a text I don't know again we have this yellow arrow unifarable it says type mismatch required int and found string and that means that it's still uh is still treating this uh variable as an in because as I said it has something which is called type inference and it can infer the type of the variable by the value assigned to it all right this is uh our discussion about variables there are more types of variables and we're going to look at that other types in the next videos and collectively they are called data types okay you can remove the space if you want so I'm going to end this video now and see you in the next video so while I was recording this course jetbrains have released a new version of IntelliJ IDEA and you will see in the course when you when I create a new project you will see a different window it's not that different it's slightly different than this window than the window that you will see when you download IntelliJ ID which is this version now which has this window and when you see this window here you just need to specify a name here you specify the location for the language selecting here you select for the build system IntelliJ and you make sure to have the jdk here and you also check this out sample code and that is going to generate the main function for you and you click on Create and the project is going to be created for you so I thought that it's good to tell you about this and uh if you'll see this window and if this window changes in the future I'm gonna release a new video and so I'm gonna show you how to if they changed specifically the window of creating a new project how to create a new project with that window but for now this is the window of the latest version all right so in the last video we talked about variables and we seen there that you can store different data in our variables and we looked at two different data types or types in short and that was the string type and that in type and the string type was used for storing sequence of characters or text and the in-type was used for storing whole numbers and in this video we're going to take take a deeper look at the integer data type and we're also going to extend our understanding to more types for storing whole numbers and that is the byte the short and the long data types for storing whole numbers you only gonna see what is the difference between this uh these types now let's open IntelliJ ID I'm going to open my IntelliJ ID on the left side make sure that project is created selected click on new project on the left hand side measure the cotton is selected and you don't need to give a name to a project again it should be in Pascal case I'm going to type bite short and long oh now go down here and it's going to select IntelliJ and make sure that the jdk is selected click on next to create a new project and click on finish now our project is going to be created and down here again a setting IntelliJ is setting up our project on the left hand side we have our project pane I can expand this SRC to see our file our main file that we created first now it was generated for us automatically I'm gonna delete this code and here we have something which is called the comments or a comment but they're going to look at comments in a separate video so I'm going to delete this sorry okay I'm gonna add this space here I'm gonna delete this you can keep the RX there it's not gonna affect your code in any way but I want to make it consistent with my previous videos but you can keep the arcs there it will make no difference in uh the way your code is compiled now let's add the code that you had previously and previously we had the we had a variable of type string for storing uh text specifically we store our name there so I'm gonna type the VAR keyword because uh in the last video we we established that you want to change this value later VAR and uh he didn't give a name to our value I'm going to call it name like in the previous video for the type I'm going to choose string and uh I'm gonna put equals and now Center sign of value to it I'm going to put again our text all right and down here I'm going to declare a variable but this time I'm going to declare it as a Val I'm gonna type I'm gonna type for the name H and for the type I'm gonna put int for storing the whole numbers I'm going to put 22. and we see in there that we can delete the type here because cotton has something which is called type inference and that means that it can infer the type of the variable by the value assigned to it so we can delete this type here and our code is going to still be valid and if I hover over here if you look at here is still treating this variable as type of string so but uh in this video I'm Gonna Leave the string type I'm gonna delete this because we're gonna look at the integer more closely and here let's uh let's change this value let's change its name to number and it's also going to be an INT and then let's take a deeper look first let's see what is an integer we know that it's a whole number so you can store whole numbers but what is it's uh it has a range you can put whatever value you want actually there is a range there is a minimum and maximum value that you can put in a in an integer data type so and to get that minimum and maximum value we type I'm going to put a space here to make what the code Mercury I'm going to type Val I'm gonna type Max integer value and for the type I'm going to choose int or you can let it infer the type you can I'm gonna actually put the type here but you can let it infer the type if you want equals and now we type int Dot and Intel J is giving us some suggestions here I'm gonna choose max value and Discord on the right here is gonna give us actually the entire code is going to give us the maximum value in a integer and if you don't if this seems confusing in that and this uppercase so uh you know you don't need to worry about that for now you just need to know that in this way you can get the maximum value to out to be out with in our console and for the minimum value we're going to type Val mean integer value for the type I'm going to choose int now I'm going to type again int Dot and again I'm going to choose from here mean value now to print these two values I'm gonna just delete this text here and I'm going to type int eger or in maximum value is I'm gonna put dollar sign to get the value Max integer value right and below this code we're going to type another println and here you're gonna put two pair of quotation marks again and I'm going to type int minimum value is dollar sign again IntelliJ is giving us suggestions you're going to choose minimum integer value now let's print this uh let's output this code to see what is the minimum maximum value which can be stored in an integer data type and if you want you can add a space here to make things more clear all right and as you can see down here when the console opened that the maximum value is 2 billion and 147 millions and so on and the minimum values to billion 147 millions and so on and these are the minimum and maximum values which can be stored in an INT so that means that you cannot put a value which is which is bigger than this maximum value or the watch or value which is uh uh which is bigger than the minimal values and so if you try to assign and to confirm that if you try to assign here a value which is bigger than the maximum integer value so let's uh type number and now we may be spotted the problem here if I try to put here equals it says Val cannot be reassigned so let's declare this as a bar because I want to change this value now I'm going to put equals and I'm just going to copy this I'm gonna put it here now if I increase this number by one let's say that I put 8 here now it immediately shows an awning and if I hover over here it says that the integer literally does not conform to the expected type int and you may be wondering how this makes any sense because here up here we said explicit that this variable is going to store integers or whole numbers and down here we have a whole number but the problem now is that this whole number is bigger than the maximum integer value which can be stored in an end which is 2 billion one four seven million and forty thousand forty three three thousand six hundred forty seven but now we have a bigger number and um to to store this number need to use a different data type or a different type and gonna see in the next videos precisely what type we need to use and what type we gonna use for storing a bigger number than the integer on the integer maximum value all right also it's important to know because he said he says here now the integer liter so you may be wonder what is this leader the liter is the value that you assign to our variable and it's called the literal because you assign we assign the value directly here so we don't have a what is called a symbolic name here and we're going to see what is a symbolic name in the next videos now I'm gonna edit this video now I'm gonna change it back to seven and also you can delete the types here the code is going to still work the code is going to still be valid and if you delete the type up here also because the type can be inferred like we talked about now I'm gonna add this video now and see you in the next video alright so in the last video we looked at the integer data type and we saw there that you can store a minimum and a maximum value in an integer and uh in this video we're going to look at the next three data types or types for storing whole numbers and those are the byte the short and the long and let's start with the buy to see what is the minimum and maximum value which can be stored in a in a byte so I'm going to type Val my marks byte value for the type I'm going to choose byte equals byte that max value below I'm going to type again Val this time I'm gonna I'm gonna call it my mean my um byte value for the type I'm going to choose byte we're gonna put equals I'm gonna type bite that mean value and now to print this to print the value of those variables I'm gonna copy this to printerland statements I'm going to paste it below here I'm going to change the text to byte and here we need to call our variables to refer all variables so I'm going to type my Max byte value just press enter to fill that for you and below here I'm gonna type my mean byte value now let's print this uh two varus the console to see what is the minimum and maximum value which can be stored in a byte data type so I'm gonna run this code now the console should open in a short moment all right as you can see the byte maximum value is 127 and the byte minimum value is minus 128 and in contrast with those minimum maximum values for the integer type you can see that these two are very very small compared to that now let's look at the next the next type which is the short and I'm gonna do the same the same I'm gonna type the same code AS sorry the same code that you had previously but uh so I'm going to put a space to make it more clear I'm going to close the console so let's see the short type right so I'm going to type Val my marks short value I'm going to put x equals choose short here for the type equals short Dot max value right I'm going to press enter I'm going to type again Val my mean short short value and for the type again short equals short that mean value now let's copy this actually we have already copied that so I'm going to paste that here to print the print our minimum maximum values so I'm gonna change this to short this text I'm gonna change it here to and now we need to call those variables because as you can see right now they are gray out and if you hover over this is the variable my Max short value is never used and that's a clever way to see when a variable is used or not all right let's change it let's change the name here because we want to refer those variables my Max short value and here you're gonna type my mean short value right let's print this to see now what is the minimum and maximum you can be stored in a short all right as you can see down here it output that the short maximum values minus 32 000 70 167 and for uh the short minimum value is minus 32 770 168 right and if you look at the the previous data types you can see that the integers the the biggest is the is the type which can store the biggest number but uh there is one actually which is bigger than the integer so I'm gonna type now the next dot that I put you gonna look at and that is the long which is um much bigger than the in integer so I'm going to close the console I'm going to type the same code I'm going to type Val my Max long value for the type I'm going to choose long and we're going to put equals long I'm going to put that marks value again Val my mean long value for the type I'm going to choose long equals again I'm going to choose now I'm going to type again long Dot minimum volume now I'm going to paste that code below here to Output our variables to Output the minimum maximum bar which can be stored in a long data type so I'm gonna so I'm gonna change this to Long I'm going to change this text also to Long now I need to refer this those two variables up here from up here so I'm gonna delete this I'm going to type my marks long value so I'm going to choose that press enter and here you're going to choose uh I'm going to type my mean long value let's output this uh code to see let's run actually our code to see what is the minimum marketing what you can be stored in a long data type and as you can see the range for the longest much bigger contrast that with the the integer data type you can see that it's a lot a lot bigger this number so the longest has a more is has a range which is much bigger than the integer and I'm going to end this video now and in the next video we're going to look at how we can use those types and um what are the relationships between between them right so I'm going to end this video now and see you in the next all right now it's time to use those for uh data types for storing whole numbers in our code so I'm gonna type some code below of those prison Talent statements I'm going to type Val because I want this very well to be immutable I don't want to change this value later I'm going to call it my number it should be in camel case like our last names and for the type I'm not Define explicit data type here I'm going to put equals I'm going to put the literal value 28. and if I hover over my number you can see that the type which was inferred is an INT now I might be wondering how this makes any sense because this 28 can easily fit in a byte or in a short on a long and that is because the default data type which is automatically inferred is the integer so actually let's confirm that this can fit easily in other data types by running our code to see what at the menu and you can see that that number can easily fit in any of those data types from this list and that is not happening because the automatically as I said the default type which is in third is the integer and if you want this type to be a byte we need to explicitly say explicitly say here buy it now if I hover over here you can see that now it's a byte and if I want to be a short we need to type explicitly here short so if I hover over here now this is a short and if I want to be I want this to be along I just type again here long and for the long there are two ways this is the first way to type the the type explicitly here sorry hover over here it's long or we can put IL suffix at the end of our number but if I put a lowercase letter you eat it immediately show this warning which says use an uppercase L instead of fail and that is because this can easily be confused with one so I'm gonna put a napper KSL and if I hover over here now this is a long even though this can be can be easy can easily fit in any other data type and if I delete this cell and if I exceed the maximum value which can be stored in an integer let's say I put 28 or something here and if I hover over here you can see that now it inferred the type to be as long because now this number that I have here exceeds the maximum value which can be stored in an INT and um you may be wondering now when to use one or the other want to use the byte I want to use the short when to use the long and you will find the the answer with the practice where with the working with them but if I run this code the byte and the short will be used in very specific cases and most of the time you'll be working with the integer data type right now I'm gonna end this video and see you on the next video we're gonna talk about the next data types which are the floating data types and those are types which you can hold the numbers which have a fractional part or decimals so see you in the next video all right before we start our discussion about the floating Point numbers respectively about the float and double data type it's important to know what are the difference between the data types for storing whole numbers under the hood because we know now that there is a minimum maximum value which can be stored in those data types and also we need to know what amount of space they occupy under the hood and let's start with a byte and our byte occupy eight bits right so abide occupy bits and we say that a byte has a width of 8. and a short can store La J range of numbers and occupy 16 bits and has a width of 16. an end has a much larger range as you know an occupies 32 bits and has a width of 32. the point here that each data type occupies a different amount of memory we can see that an internet is the four times the amount of space that abide does for example it's not particularly relevant to you to know these numbers but it come up as an interview question and it's useful to know that a certain type takes up more space than others all right now let's close our project because I'm going to create a new project now I'm going to click here on new project because we have our previous project here all right on the left hand side again kotlin should be selected for the name I'm going to call it um it should be in Pascal case float and double all right here is Eric for the best system IntelliJ and for the produce jdk select the indicator I'm going to click on next and I'm going to click on finish now approach is going to be created [Music] right let's delete this code we can keep the arcs and the array string here I'm going to keep it to see that there is no but there's not it's not making any difference in our code I'm going to drain the I'm gonna delete the print again statement and I'm gonna expand this to the left because we don't really need the project pane actually I'm going to expand it full then click here to hide the project pane all right um floating Point numbers are used for storing numbers which have a fractional part which have decimals so floating Point numbers are used when you need more Precision in your calculations and you'll as you'll see in the next video this uh has a practicality now to declare a floating Point number just type Val because I want this variable to be multiple I'm going to call it my number again should be in camera case now first letter first word starts the color case later and the following Awards should start with capital letters and for for the type I'm going to choose let's actually not choose any type let's just put equals and try to try here to assign a value let's put 2.5 okay now if you hover over here and if you look at what type this value has what type this variable has you can see that the type which was inferred is the double so if we want to change the type we can put here float let's say to be a float but look what happens when we do this it says that the floating Point literally does not Comfort the safety type float and that is because like you know in our example with the integer the type which is inferred which is automatically assumed by kotlin is double in this case so even though it is set here explicit that you're going to store a float because it types here a literal value it considers this to be a double so to solve this you need to delete this from here and put here at the end of our number and F now if I hover over here now the variable has the type float so this is how you declare a float variable into put if at the end of the number of suffix and the for the for declaring a double you can just uh type Val let's call it my second number equals and if I put 2.5 here 0.5 now if I hover hover over here like in uh like I said previously it automatically infer the type to be a double so if you don't specific I if you don't specify a type the automatically inferred type will it will be a double because this is the type which is uh inferred for the floating Point numbers and this is similar to the integer type because there we've seen that the type which is automatically enforcedent so here we have the same thing so this is how you can declare a floating Point number and this is how we can declare a double now what is the difference between this the different in the Precision in which depression with a half and we'll see in the next example in the next video we're going to be talking about operators and operations what is the what is the Precision of a float and what is the position of a double and the float comes from a floating Precision number and double comes for double Precision number and as the name implies the the double data type has a more has more Precision in our calculation and you're going to see an example of this in the next video because you need to First learn about operators and operations before we we introduce any kind of operator here even though we we've already used an operator which is the assignment operator which is this operator here but we're going to talk about this in the next video so I'm gonna end this video now and see you in the next video we're going to start our discussion about operators and also in that video you're going to see uh that the float has a smaller Precision than a double and the double is assumed to be it's assumed to be the default ibicos has a bigger procedure so I'm gonna end this video now see you in the next video but before we end our video actually let's uh print let's output those values in our console let's output the values of the variables in our console so I'm going to type println statement below for code below the creation of our variables and inside the parenthesis I'm going to put the double pair of quotation marks I'm going to type my number equals dollar sign to get a value the content of my number and my second [Music] number we put equals again dollar sign not here my second number now let's finish those values in our console and as you can see output is 2.5 and 2.5 but if I hover over here you can see that the type for uh because it's explicitly given here is the float if I hover over here this is the double but let's see what happens if I delete the fractional part and I just actually you can uh you can put a lowercase if lowercase f here or an uppercase F like this if you run this code again you'll have the same output again now let's uh delete the fractional part and just let an F there and here let's also delete the fractional part and it's let's run our code and you may be know what is going to happen now printed 2.0 for uh my number because we said exclusively here that this is a flow so it prints the fractional part but uh okay in the case of my number you only output is the 2 because now this is inferred if you hover over here as an INT so one solution to this maybe to type here double and try to see what happens and if I hover over this hover over here says the interior in the integer literally does not conform the expected to tie double and it's correct because this is assumed to be a need so you cannot uh you cannot even though it said exclusive here that this is going to store doubles here we put an INT an integer value so if I delete the type here let's say if I try to put a d here actually there is no D for the double there is no like in the case of the float you know if even if I try to put the uppercase there is no uh way to add the suffix to our variables the only way is to put directly here to point zero and now this is inferred as a double as you can see here and if I run this now it output the 2.0 and 2.0 in both four variables all right I'm gonna end this video now and uh see on the next video [Music] all right so far in our course you've only dealt with data types which can store numbers but there are two different data types which you're gonna look at in this video which you can use for storing a different type of data and we're going to see what kind of data we can store but those data types are called the Char data type and the Boolean data type but first let's create our project let's create a new project I'm gonna give it a name I'm going to call it char and Boolean again it should be in Pascal case make sure for the build system that you select IntelliJ and measure that have the produce jdk selected so I'm going to click on next to create our project I'm going to click on finish now project is going to be created on the left hand side we have the project pane we have our code Auto generated for us even though this code is gonna we're gonna delete this code which is inside the curly braces because you don't need a squad so I'm going to delete this code and let's also hide the project pane because you don't need a project pay and let's see how we can declare a chart data type and after that we're gonna talk about how where you can use the shutter type in a specific case and what specific cases you can use so I'm going to type Val because I want this variable to be mutable I don't want to change valid value later I'm going to call it my Char value again it should be in camel case and for the type I'm going to put colon I'm going to choose char press enter let's put equals and let's now assign a value to this variable so this time I'm gonna type a single pair of quotation marks not a double pair of quotation marks like we did in our string data type and in a chart data type we can store only a single sum symbol and that symbol can be a letter a number or an exclamation point on the mark so I'm gonna put here a d a single letter D and uh you may be wondering now what is this what is a specific case when you where you can use a charter value a specific case can be let's say if you want to store the last key press the bio user so this is a specific case where you can use the charter data type now let's print this value in our console to see that it should be in a lowercase letters pinterland and uh you can print it by the usual or you put here a double pair of quotation marks and we type a dollar sign and hero we type the name of our variable match our value press enter I messed up the code let's delete this now if I run this the console will start in a short moment and you're gonna see the output of the letter d right so the console opened and now we have output down here the letter d so this is the usual way how one of uh referring a variable that but you can refer the variable even like this by not putting the dollar sign deleted the dollar sign and also the the quotation mark at the beginning now if I run this it's going to still output the battery so we will see that we have now most of the letter A so this is another way of printing the value even in a variable but this uh it's not really the usual way to do it now um let's take a look at the next data type and that is the Boolean data type and to declare a boolean.type we type again Val because again I want this to be multiple and and I'm going to call it my in camel case it should be Boolean value for the type choose Boolean and a Boolean a Boolean data type Can Only Store a true or a false or a false value so you can only assign here true or false so if you type now let's put in those values but this time I'm going to put the parenthesis and I'm going to put the quotation marks I'm going to type my char let's my char value equals dollar sign my chart value and my let's type the name here Boolean value equals and let's put the dollar sign my Boolean value now if we run this code now you can see that my chart value which is this text here has this value which is the content of this variable that we're referring here and uh my Boolean value which is our variable the name of our variable has the content of false so it printed here false now Boolean data types the Boolean Atlas are going to be used in our code a lot because the Boolean data types can be used for controlling the flow of the program so you can in you're gonna see that in combination with the if statement without which you're going to look at in the next video on the next videos uh you can control you can actually control the flow of the program because usually the flow the program is from top to bottom and with the for with the the Boolean data type and with an if statement as you'll see you can control uh actually what you can control to you can control what parts of the code are uh compiled or not based on a certain condition if that function is false or if that condition is true so Boolean dial types are going to be used as you'll see a lot in our code in your coding career as you'll see so these are the two data ties that can be used for storing either a single character or a or a character and this is the data type which can be used for storing true or false which is called the Boolean type also you May so already that you can delete the types yet because as we talked about kotlin has what is called the type inference so can it infer the type by looking at what value assigned to it so in this case you know it knows that this is a type of chart so here you know you can see that the type is a Boolean all right but before we end our video let's do a little recap about the eight data types that we looked at into throughout these videos and the eight data types are the byte short int and along those are for storing the whole numbers and the next two data types are the float and double for storing floating Point numbers for numbers which have a fractional part decimals and the next two ones are the ones that we looked at in do this video and those are the Char and the Boolean and those data types are also called the primitive data types because it has to do with their call like that because it has to do with how they are stored in memory and a string data type is not really A Primitive Delta because the store is stored a little differently also as you can see the string data type has a special language support so you can consider this eight primitive data types as the building blocks for data manipulation and in the next video we're gonna look at those this data manipulation but by looking specifically at what operations we we can do with the those data types because in uh throughout this this video we only looked at how we can store values and how we can output this those values but in uh in a real real app you'll need to to manipulate that data to other to subtract something and we're going to look at all of this in the next video see you next all right so far in our videos we've only looked at how we can store different values in our variables how to Output them to the console but in a real app you'll need to do some mathematical calculations so in this video I'm going to learn about that we're going to look at operators so first let's create a new project I'm going to click on new project I'm going to speed up the process now a little bit because we did this already a few times so I'm going to call it operators I'm going to select IntelliJ click on X and click on finish now our project is going to be created in a short moment again on the left hand side you have the project Pane and we have the main effect function and the code Auto generator for us now we're going to delete the code inside the curly braces inside the calibrations of main function because it only Discord and also I'm going to hide the project pane because I don't need the previous Pane and first let's declare two variables I'm going to declare the first variable as a VAR because I want to reassign this value later I'm going to call it um uh let's say um X and in a real app you should use more descriptiveness because the name of the variable should say what the variable is doing anyway I'm gonna put equals I'm going to assign a value of five and the next variable I'm going to declare it as a Val because I don't want to change its value later I'm going to call it I I'm going to put a value of 3 here and next I'm going to decode another variable this is going to be also or Val I'm going to call it result and we're going to store the sum of 5 and 3 here and to do that type here x and this is the first operator that we're going to looked at look at and that is the add or the plus operator so I'm going to put here X Plus I now let's print this result I'm going to type println I'm gonna put the double pair of quotation marks I'm gonna type result the text equals dollar sign to get the value of the variable here I'm going to press enter to fill that suggestion for me and now let's run this code to see what is going to Output you're gonna see the output 8 here because five plus three is eight the console should open in a short moment right so it output the result equals to eight because five plus three is eight now what we have differently here and we didn't uh we didn't have we didn't had previously is that now we're using a variable the variables here and we're not using liters like we have here five and three type directly and um it's important to to clarify some names here and first is the name operand and open an operand is any object which which isn't affected by an operator in our case the operands are X and I because those those variables are affected by the operator plus because it sums their values and then it puts these values in the variable result so those two variables X and I are called operand also the if you had here little revolves if we put it here let's say 5 and 3. directly these two all are also called operands so literals or variables are called the operands any any objects which is affected by an operator is called an operand because if you now if you now you're gonna see also eight here but let's change it back to to I and X and there is another way to to output the value of x plus I by using a placeholder what is called the placeholder and to do that let's first delete this line of code and this now is red because we don't have the variable declared I'm gonna delete what is inside the quotation marks I'm gonna I'm gonna type here X plus I the text equals and now I'm gonna put here I'm going to put here dollar sign and I'm gonna put curly braces and inside the color braces I'm going to type Let's uh click here to make it clear X plus I so this is called the placeholder and you can use this and in a placeholder we can only put expressions and an expression is a construct which evaluates to a single value so in our case X plus I evaluates to a single value because it Returns the value 8 so this is why we can put here uh X plus I and uh even though if you if you if if you put something which you will not uh be an expression here IntelliJ is going to warn you and I'm gonna see uh in the following minutes um an example of that now let's out for this and you're going to see the same result but now we have the different text here we're gonna have we're going to have X plus I so now I have X Plus PSI equals eight which is the correct result now let's copy this four times and to do to make that easier we can press Ctrl D or command D on Mac so I'm gonna press Ctrl D four times now let's change this to minus because we're going to look at the subtraction now here we're gonna look at I'm gonna look at the multiplication operator which is an Asterix operator so I need to put here inside the curly braces the Asterix because these were the expression is evaluated and the next is the division so we're going to put here a photo forward slash so I'm going to put here also forward slash forward slash right and you know this uh this operators for a month class this one but the one that is not so well known outside the programming uh it's uh it's called the modulus operator and the modulus operator is operator which um gives us the reminder of a division so the models operator is a percent sign so put per second sign here and percenter sign here right now if you run this code all right so now we have the output down here and we have X plus I see eight because five plus three is eight x minus I is 2 because 5 minus uh 3 is 2 x times Y is 15 because 5 times 3 is 15 x divided by Y and this is interesting is 1 but because those variables are of typing they're inferred automatically to be of type in it dropped completely the fractional part here so we don't have here 1.6 or something you have only the integer part which is one and here we have the the modulus operator and this gives us the remainder of 5 divided by 3 which is 1 and has a reminder of two now if you want to to have here the fractional part you need to declare uh one of the variable uh as a type as a floating Point number and that can be or or either a float or a double so then I'm going to declare the the I variable as a double so I'm going to put 3.0 Here and Now all the variables all the results here are going to be are going to be are going to be of type double so if you run this you're gonna see the fractional part for all the variables here now you can see now we have wipe one 8.0 2.0 15.0 and here we have 1.6666 and 7. now it shows also the fractional part and uh for the reminder all we've we've also have the fractional part here so um now the type of the if you want the type of the expression it's a double because we declare here as a double this variable I as a double and the next one is wide then automatically you don't need to declare also the ex as a double it will be um so if you want widen automatically by the fact that it required the I variable as a double all right and let's continue and often in programming you'll want to increase a variable by a certain number and to do that let's first let's declare again the variable result down here let's declare it as a VAR because I want to resign it let's call it result and let's put again X plus I here now if you want to increase let's say the the value of the variable by 2 we can type something like a result equals result let's say that I want to increase this variable by 2. I'm going to put result equals result Plus 2. and this equals operator is different from a mathematical equals because this equal separate operator is not saying that result equals result plus 2 because I think it's incorrect what this equals operator is is also called it's an assignment operator and what is doing is that it assigns first it adds to to our variable result and then it store stores that that result that result of the that expression in our variable result all right so let's print this value to see what we have here so if I print this you should see 10 here not print I'm and I'm going to put here result equals dollar sign result and in front this code you're going to see 10. right so you have 10 but let's uh let's delete the the fractional part here to have the type of the variable as integers so let's run this code again so now we have 10 here result equals 10 and let's copy this called the again four times let's add a space so now I messed up the code and if you mess up the code like I did here you can do you can undo this thing by going to edit and click on undo paste or the shortcut is Ctrl Z and you'll see the corresponding shortcut in a Mac here on the right so please press here and now our code is restored here as you can see so let's copy this again foreign and let's space this down so one two three four all right now let's change this this one to minus let's change this to multiplication which is the Aesthetics operator let's change this to division which is the follow slash and let's change this to modulus which is the percent sign now if you run this code let's run it from the top right right hand side now what you're going to see is that first we have 10 because of now the result has a value of 8 because X plus sign is 5 plus 3 we have eight and now here we we're adding 2 to our result and then we print that value in that variable in our in our console and that is gonna output 10. the next we decrement that variable by 2 and we have eight next we multiply that that uh variable by tools so we have 8 times 2 which is 16 which is the result here next we have a result divided by two and uh 16 divided by 2 is 8 so you have eight eight here now now we have result modulus 2 and 8 modulus 2 is 0 because 8 divided by by 2 has no reminder right next you can see that we have all of those underlines here and if you hover over one of them it's gonna say replaceable with operator assignments so there is a shorter wave to write the same thing that we have here or there is an abbreviation to write the same thing that we have here and here and here and here because they are so often used in programming they are there is a abbreviation for all of them so let's click on replace with plus and equals replace with minus n equals replace with the multiplication and equals with division and equals and with modulus n equals here all right so this is the abbreviation of what we had previously or a short way a shorter way to write the same thing so if you run this code now you're going to see that it's going to Output the exact uh values that you had previously so we have 10 8 16 8 again and zero so this is a shorter way of abbreviating uh oh actually this is a way of abbreviating what we had previously because as I said they are very very often used in programming what is all right now another important thing to know is operator precedence so first let's type again a println statement and I'm going to put the worker recognition marks and inside the quotation marks I'm going to put the text to three so this is the text three plus three times let's say um four now also inside the quotation marks let's put a dollar let's put equals here the text and let's put a dollar sign here and now let's put curly braces and inside the curly braces I'm going to put three plus three times four let's click here to make it clear times 4. now if you run this code now you see that it outputed 15 because multiplication has precedence over addition so it first multiplies 3 times 4 which is 12 and then it adds 3 to our results so we have 15. but like in a math class you can control which expression is evaluated first by putting parentheses so if I put parenthesis here now this will be evaluated first three plus three and then it will multiply the result by four so if you run this code you're gonna see three plus three is six times four is 24. so you're going to see 24 right now so you can see that operators have precedence but can control that precedence using parentheses like you did here so multiplication and division have precedence over additional and subtraction all right there are two other operators which can be used for increasing or decreasing the value of a variable exactly by one and let's look at this operator but first let's uh use our variable X that we declare above and let's assign a value of 0 to it and to use the increment and decrement operator this is how they are called let's use the printerland statement first to let's put a double pair of quotation marks here and let's type x equals and let's put dollar sign and let's type here [Music] X and to use the increment operator we type plus plus right and what this is gonna do is going to increment the value of our variable which now is 0 by 1. and there is another way to increment the value for a variable by putting the increment upper operator or the plus plus operator in front of our variable not at the end of our variable so we can type again a println down here let's put the quotation marks and I'm going to put x equals and now I'm going to put dollar sign plus plus X but this now is not working because dollar sign only works if you refer a variable so to do solve that you're going to put this in a parenthesis actually in curly braces so let's put this in color braces and let's put the above one also in curly braces not here all right and uh both of both of these increment increment value of x by one they differ in what value they return so the first first Returns the value of x which is zero and then it increments and the next increment operator which is before the name of the before the variable it increments the variable and then returns its value so what you're gonna see if you output this code is going to be interesting so if what if you output this code let's bring it down you're gonna see Zero and two and maybe wondering how this makes any sense because you have incremented the value here and uh that's that does this happens because this first Returns the value of x so it returns varices and then it prints the value of 6 which is zero and then it increments so now the X has the value of 1. when the next printerland statement is executed now it with the variable x is incremented by one so it has a value of one and now it will be incremented again but it will also be returned not like in the previous uh increment operator which is the other end so now it will have the value of 2. okay and there is uh the same operator is available available for uh decrementing so if uh if you want to decrement a variable exactly by one I can put here x let's put equals let's put the curly braces actually the dollar sign curly braces and can put x minus minus and let's print just call the printerland function again I'm going to put x equals dollar sign again curly braces and let's put now the decrement operator which is the minus minus in front of our variable now you're going to see something similar but in the inverse way so now we have now we have two and zero and let's explain uh this also so again this printerland statements executed now the X has the value 2 and it returns to and then it decrements so it prints the value of 2 and then it decrements the value of our variable X by one so now we have one when the next printerland statement is executive or function is called now the value is 1 so and it first decrements the value and then it Returns the the the the value of the variable so now we have zero because it was decremented this is why you have uh 0 and 2 and 2 and 0 here all right so you see above here that I declare the variable as a VAR so I can reassign this value down here to zero right this is our discussion about operators there are more operators but in order to talk about the next operators we need to first talk about an if statement so now it's time to look at comments and comments are nodes that you can add your code and they are ignored by the compiler and usually they are they are used when you want to add some description about the code so what you want to indicate what the code is doing because you may roll some code and you come to that code a few weeks later and forgot what it's doing and by putting comments you can you can see specifically what that code is doing and when in kotlin we have two types of comments the first is so-called end-of-line comment and to add an end offline comment we put two slices and here we put our comma let's say here we are doing ope operations so this is another End of Line comment and this is a text which you simply says here we are doing operations and this is uh as I said an end of flying comment the next comment that you can use is so called The Block comment and to use a block comment we put slash Aesthetics and now you can press enter or you can put Asterix and slash to add to to add the the next uh to close this comment and you press enter and as you can see it added automatically this Aesthetics and slash or you can type this yourself and here you can put some text which can be some it can be something which is going to say what the code is doing so so those are the two types of comments that you can use in kotlin The End of Line comment and the block the block comment and you can also use comments to disable some code so if I put two slices here now that line of code is going to be ignored by the compiler so this is our discussion about comments see you in the next video alright before we continue discussion about operators let's first introduce the if then else statement and uh let's first start talking about how usually our code is executed and usually our code is executed from top to bottom and that means that our code is executed line by line and that is the flow of the program but with an if then else statement you can break the flow of the program by imposing a condition and you can say to the computer to execute a particular section of quad only if a condition is true so let's see how we can do that so let's first create a variable I'm going to type Val this is going to be multiple I'm not going to reassign this value I'm going to call it it's active and I'm gonna put equals and I'm going to sign a value of Truth way so it's going to be of type Boolean on the next line I'm going to type the if keyword and now IntelliJ is giving us some hints here I'm going to press enter and inside the parenthesis we put our condition so here I'm going to type is active the variable and now I'm going to type equals equals notice that here now we have two equals and here we type true next we put a left curly brace and now we can add the right curly brace or you can press you can press enter and the right curly brace is going to be added automatically by IntelliJ for you so if I press enter now you can see that on the line 40 we the right calibrase was added automatically now let's type here a println statement so I'm going to type println press enter and quotation marks and here we're going to type the text the user is active right and uh if you run this code let's see what happens and we get the output the user is active which is the text that we typed here and let's first talk let's first talk about what we have here and uh the if statement checks to see as I said to see if this condition inside the parenthesis is true this if this expression returns true and it does that by checking to see if the operands are identical or if they are the same so it checks to see if the content of the variable it's acted which is uh true it's equal to true and that is that sounds convenient but it's true because uh our variable it's active has a value of true and here we're checking to see if our uh if those two are equal or if they are the same and that is true and this expression returns true and in effect the code inside the curly braces is executed but if I change this to false so if I change this value and if I run this code now this condition inside the parenthesis is going to be false and the code is not going to be executed so you can see now that you don't see any output because this condition is false and because the condition is false the code inside the curly braces is not going to be executed but uh if you want to cover the part where the condition is false so if you want to execute some code even though the condition is false you can type here else and here you also need to put the calibrases so I'm going to put the left curly brace I'm going to press enter and the right calibrate so that added automatically for me now I'm gonna type println and inside the parenthesis I'm going to put the user is not active so now what is going to happen is that this condition is going to fail it's gonna be false because the two operands are not equal respectively is active and true and is going to be executed the else part in this case it's going to be executed the code which is inside the curly braces of the else so if you run this code you're going to see the output the user is not active so as you can see now it says the user is not active because this condition is false this returns this Boolean expression return false and it jumps to the else part so this is how you can use the else part now what we can also do is to add another if statement below of our if statement to chain more if statements to check for more conditions but to do that we need to use another operator which is the called the greater than operator which is an operator which you may know from your math class and through that let's change for the variable so I'm going to type here a value of 100 to make it an integer and also I'm gonna change its name and to change the name of the variable go right click on the variable go to rename to refactor and go to rename and now if you change the name of the variable here is going to be change every where where the variable is called so if I look what happens if I delete the name here it's changed also on the line 38 we're referring the variable and now I'm going to call the variable my number and I'm going to press enter now the name of the variable it's updated and now this condition is not correct you don't need to put a greater than sign so I'm going to put the greater than sign and let's check for uh let's say if my number is greater than 150 and this is false now because my number has a value of 100 so this is going to evaluate to false this condition this expression now let's add here another if state if statement so we're going to put here else if and inside the bottom test you're going to put the condition and now I'm going to type again my number my variable or variable now you're going to put let's say or greater than 90. now this condition is true so let's add Also the curly braces because we need the we need the to put our code inside there let's put here open until then also let's type here greater than 90. and here let's also change the test to greater than 150 and here you can put all the conditions here you can put all the condition failed because the else part is going to be executed only if all the condition that we have here which is uh for that my number is greater than 150 and this is false my number is has a value of 100 and if our lcf condition also evaluates to False only then the else part is going to be executed so let's run our code to see what what if statement is going to be executed what part so you can see that we now get we get greater than 90 and that means that this condition is true because it's true that my number has a value of 100 and it checks to see if my number is greater than 90 which is true so it executes the code which is inside the else if part right now the next operator that you can use is greater than or equal to so you can put here greater than or equal now what is gonna check to see is to is that what is going to check is to see if the number that we're comparing to respectively my number is greater than 100 or equal to greater than 150 or equal to 150 so let's change this to let's say um um 100 and uh 49 so look what happens now so now it's executed the this part the lc4 because this is greater the number greater than 90. but if I put here greater let's change the value of my number to um 150 to see what happens and now we get the output greater than 150 and this is correct because now this condition is true my number is greater than equals to 150 and uh my number has the value of 150 it's not greater than 150 but it's greater than or equal to so it's equal to 100 150 so now this condition is uh satisfied and the code inside this curly braces is executed which is greater than 150. all right now I'm gonna end this video and in the next video video we're going to continue our discussion about um those operators right so now let's continue our discussion about the next operators that you can use in kotlin and let's start with the less than operator and to do that let's first change the value of the variable my number to 100. and to use the less than operator you we put here a less than sign which you probably know from your math class now if you run this code I should change here the text to make it consistent let's type here so now if you run this now get the output less than 150 and this is true because the value of the variable my number is less than 150 so this condition now evaluates to true the next operator that you can use is less than or equal to similar to greater than or equal to operator and to use the less than or equal to operator we put here a less sign and the equal sign right and let's change the value here to 150 to make it clear now let's change also the value of the variable to 150 and let's also change the text here now if you run this code you're going to see the output less than or equal to 150 because now the else if part and the condition of the else if statement evalues to true because now the the value of my number it's not the it's not less than 150 because it's 150 but it's less than or equal to 150 so this condition evolves to true right the next operator that you can use is called The Logical not equal operator and that operator is used to check if two operands respectively to if my number let's say or and 150 are not the same let's see how we can do that and to do that to type here an exclamation mark and an equal sign and this operator here which is going to make a mark is gonna check to see if those two operands respectively my number and 150 are not the same and only then the condition is going to evaluate true so let's run this code to see what happens so now we get the output less than or equal to 150 because we still have the volume 150 so it jumps to the lcf part but if I change this to let's say 100 now look what happens now it execute the if now this condition evolves to true because now this operator is checking to see if the two operands if the value of my number the value of my number is not equal to 150 and that is true they are not equal and this is why you get here the output but let's change the output to make it clear let's type here they are not tickle so if you run this code you're going to see the output I are not equal because that condition now Evolution so this is how you can use the logical not equal operator also with the logical not operator we can change the value for Boolean expression from True to false and from a false to true in other words you can negate its value and to do that let's first declare the code that we had previously so I'm going to cut again the Val variable it's active I'm going to assign a value of true I'm going to type the if statement again I'm going to put the same condition equals equals true here you can put the left curly brace and press enter we can add the right color base if you want but it will be added automatically for you I'm going to type else also the left curl base press enter I'm going to put the text that you had previously all right now if you run this code you're going to see the output the user is active because this is going to evaluate to show their are equal they're the same let's expand this so you see the output user is active because this condition average to show and before you look at The Logical not operator how we can get the value let's first see how we can write the same expression that we have here in a shorter way by abbreviating so because you have noticed probably that we have another underline here and if you hover over here it says that the Boolean expression can be simplified so let's click here simplify Boolean expression to see what happens so now we get if it's active and then print then execute the code inside the curly braces so this thing now does the exact same thing that we did previously it's so it checks to see if the value of its active is equal to true so it's a short way of writing the same thing and uh now get the output the user exactly but with the equal not operator you can put the exclamation mark in front of our its active exp expression and it's now now it's going to negate this value now it's going to change its value from True to false so now if you run this code not going to see the output the user is not active because now this logical not operator switch is switching its value to false so now this is going to be this will evaluate to false it and it's going to execute the else part that we have with the user is not active and you can do the same for a false so if you put here false now let's actually execute this without the logical not operator to see what happens now this will not execute so it will execute the else part so you see the user is not active but if I put the logical not operator in front of its active now it's going to change its value from false to true and now this will evaluate to true and it will execute the oh code inside the calibration of the if so now you see that it says the user is active so this is how you can use the logical not operator to flip a value from false to true or from True to false and you can do this for for every Boolean expression that you use so you can put the logical note operator in front of this actually not in front of this um you can put the logical not operator generally speaking in front of any Boolean expression right so this is our discussion about operators so in the next video we're going to look how we can combine multiple Expressions to create a bigger expression which you sell for returns uh true or false value see you in the next alright so I deleted the code that we had previously you can keep the code that you have to use if you want but I deleted to make things more clear and in this video we're going to look at how we can combine multiple Expressions which in essence can return a Boolean value which can be either true or false and uh let's start with the first operator which is called The Logical end operator but less vertical two variables I'm going to declare a Val variable I'm going to call it it's playing I'm going to sign a value of true sweet so it's going to be of type Boolean and on the next line I'm gonna declare another variable also of all and it's going to be called score and it's going to have a value of 80. now down here we'll type if and inside the parenthesis to type is playing equals equals true so this is the equals to operator I didn't then talk really a lot about the equals operator but equals to operator checks to see if the two operands are the same so it in contrast to the one equal operator the one equal operator assigns what's on the right to do our variable which is on the left so in this case assign truth or variable is playing so or it's a sign 80 to a variable score the equals the two equals or the request operator is different because it checks to see if uh what we have on the left or what have on the left in and on the right are the same or are identical next and we know from the previous video that you can abbreviate this you can write this in a shorter way by putting just is playing this will be this is going to be equivalent to what you had producer because as you can see it says that you can simplify the Boon expression and now gonna you use the logical end operator and use the logic logical end operator with type 2 Ampersand science and here we type score now I'm going to use again the equals equals operator this time we need to use it there is not a shorter way to check for a new type if score equals to 100. all right so this expression inside the pattern this is going to evaluate to True only if both Expressions respective is playing and score equals equals to 100 evaluates to true so only if those two conditions are true only then the code inside the parenthesis inside the curly braces actually is going to be executed so let's say that in a real app here you can add the logic to open the next level but here we go just gonna output some text so I'm going to type here next level opened right and also I'm gonna add the else part here and we're gonna put also printerland statement and inside the part of this is going to type steel art the same level now if you run this code you're going to see the output still at the same level because not those conditions are not both true is playing is true but it's playing is equal to true but our score is not equal to 100 so this is going to evaluate to false and the entire expression inside the pattern is going to turn false so it's going to execute Tails part now if we change the order the value of our variable score to 100 now both expressions are true is playing equal to true and score and the score is equal to 100. so now both of our expression are true and gonna see the text Next Level opened and I will see that it output the next level opened so this is The Logical end operator and you're going to be using uh The Logical and operator a lot in your code all right so now it's time to continue our discussion about operators and going to look at the next operator which can be used to combine multiple expression and that is the logical or operator and the logological or operator evaluates an expression or multiple expression in this case to true if one of the condition is true or if both conditions are true so let's see an example of this but first let's comment the code that we have here because to make things confusing so go to code and select comment.light command with line comment or you can press the shortcut Ctrl slash now let's equal to variables down here the first the first is going to be a Val I'm going to call it num1 I'm going to sign a value of 5 to it second is going to be also Val it's going to be called num2 and I'm going to send a value of 3 to it or four now I'm going to type the if Dental statement I'm going to type the if keyword inside the parenthesis I'm going to put the condition first is if num1 is greater than zero and now to use the logical or operator we type two vertical bars here now we put our next condition or our next expression and that is num2 is also greater than zero and we put a curly brace press enter two to add the right color base and put also the else part and inside the calibrases of the if let's print some text let's say the condition is true all right now if you run this code you're going to see the output the condition is true because now both conditions are true and The Logical operator returns true if both conditions are true or if one of the condition is true so let's see if we change this to -3 and now our second condition num2 greater than zero is false so now this is also going to evaluate to true because The Logical operator returns through if one actually with one of the conditioners or if both Constructor so now get conditional show but if you change this to also to -5 now our both both conditions are false now you're gonna see that it's gonna be executed the daily spot because this condition is going to be false because both conditions both Expressions num one greater than zero and num two greater than zero are false all right so let's change it back to five now if you're on this code you're gonna see the condition is true because at least one of the condition is true which is this one normal and greater than zero even though the number two condition is false all right and this is how you can use the logical or operator all right now it's time to see how we can use the if Daniel statement as an expression and that means that the if Daniel statement can return a value which can be stored in a variable so let's see how you can do that but first actually skip this code that we have here and uh to use the if Daniel statement as an expression we declare of um a variable first so I'm going to create a Val and let's give it a name I'm going to call it let's say text and to use the if then else statement as an expression we put equals and after the equals we put our if then else statement now we need to assign a value to our variable text to use it as an expression and the value is going to be the last expression in the in the curly braces so here if I type the text let's say uh this is text one and down here if I type quotation marks this is text tool now if I add a print Ln here at the end and if I print the value of the variable text that we declare above let's put a dollar sign and if I type text here now you can see our variable it says it's of type string so if I run this code now you're gonna see first this println inside the curly braces which says the condition is true and after that you're gonna see this text being assigned to our variable text and it will be output out output it down here by the printerline statement so you see this is text two actually I was wrong that condition is false because it will have minus five and minus three and this condition but it's the false and the last the last expression in the in the curly braces is assigned as a value to our variable now uh what you can also do is to remove the curly braces but it's recommended to use to not use the curly braces if you have one only one statement uh in your if Dental statement so let's delete the printerland here let's delete the curly brace here let's also delete the calibrase here let's delete the printerland statement here and let's also delete the curly berries here so now this will work the same to work like previously but uh so now you'll see the same output without the condition without this take the control result because now we don't have the printerline statement so now get this text too because this condition evaluates to false and it assigns this value to our variable text then down here it prints so also you see that this uh they are not aligned here this our variable and two format your code you just go to code and click reform reformat code or place Ctrl alt L on Windows or you can um use another shot you can use the corresponding shortcut on Linux or Mac so click on code and now we're gonna see that our code is formatted if you run this now see this is text too but let's change this to five now this conditional overlay to true and this expression is going to be is going to be assigned or variable text so if we run this hmm you're gonna see this now our variable text is assigned the value of this is text one because this condition is true and inside this value to make things more clear clear you can use a you can you can type your code something like this now this does there's everything is the exact same thing as previously so if you run this code now you're gonna see that now this it says the same thing this is text one now you may be wondering what type this variable is so if you hover over it this is the it is of type string but look what can I do I can put here a number so if this condition evaluates to false this is going to be assigned or variable test so if I run this now now get this text one and let's uh put here -5 for the condition to be false and if you run this code now now I'm going to see five and you may be wondering how this makes any sense because previously our variable was of type string but if you have hover over here now it says Vault text and the type is this thing comparable anyway but what is uh simply doing here is looking at the condition it's looking first at the if statement and if this condition is true then it assigns our text or variable and then it infers the type to be a string right if this condition is false then this part is skipped and then it assigns this value of 5 to our variable text and not and then our variable is going to be of type int so there is no case in which both value is going to be assigned to our variable so this is why you can use here text and here an integer even though but if you declare explicit here that this variable is going to store only strings only sequence of characters or text now he'll get an earning because it says the integral transforms the expected stream so in other words we cannot put here but a number because we said that explains here that is going to store only strings but if you omit the type that is gonna work so you can decide not to depending on the context what to choose so this way of writing the internal statement in one single line like we have here it's okay as long as we use the if the general statement as an expression or in other words if you're assigning a value to a variable like in our case but if you have multiple instruction you know also if you have a single single instruction you can also omit the curly braces but most of the time it's recommended to use the curly braces because that allows the those allows us to execute more than on uh instruction on the statement in your code and it also makes the code more clear so let's change this code from an expression to just a new general statement to see why so I'm going to change this I'm going to add the curly braces from other code press Ctrl alt l all right and low solution it is let's delete this text let's add to print Elena statements here foreign now if you run this code you're gonna see this part executed else part because this condition is false fault of our condition respectively num1 great is not greater than zero and also num2 is also not greater than zero so this is going to return false and it's going to execute the else part all right but now if you change this to five and now one of the conditions is going to be true and as you know this entire expression is going to wait is going to evaluate to true now because at least one of the the expression is true so if you run this code now I see this condition is true and also we see all our second printerland statement this condition is running some text but look what happens uh if I uh let's say if I delete the else part right and if I delete the curly braces here all right and now if I run this code you see the now both statements are executed but as I said if you don't use curly braces you want just only one of the uh statements in is going to be executive so why you have both of these because the first is if you executed as part of the if statement because this one is true and the next one is executed because it's part of the code because it's red from top to bottom but if I change this to false and now I want both condition both statements respectively with this one and this one to not be executed look what happens now get this condition experience on text so the first instruction in our if the next element is omitted because it's part of the if the statement but the second one it's executed because it's part of the code so it's going to be red anyway so this is why you need to always use curly braces in this way the entire code is also is gonna be either executed or omitted so this is our discussion about the external statement and you should always use the curly braces and for this part you also you should use the curly braces and um only omit the calibrations if you have only single one single statement or one single expression if you want to use uh leave the statement as an exception to assign a value to a variable but if you have just one single statement let's say you have something like this economy the curly braces like this so now you can see that everything works fine so you can use it like this if you have one single statement like we have here you just print some text to our console or if you use it as an expression so if you sort of value in a variable so see you in the next video all right now it's time to look at the next control flow statement that you can use in kotlin besides the the if Daniel statement and that is the when statement or the one expression but first let's create a new project I'm going to call it Ctrl flow it should be in Pascal case select IntelliJ click on next and finish right now let's delete the code inside the curly braces let's hide the project Pane and let's first declare a variable it's going to be a Val it's going to be called alarm and I'm gonna assign a value of 12 to it now to to declare when statement we type here when we put parenthesis and inside the parentheses we put our argument in this case is our variable alarm next put space and we put the curly braces press enter and now we put the expression here so here I'm going to put the value let's say 12. now I'm going to put a minus sign and a greater than sign so I have this Arrow and here I'm gonna type print Ln this is the code that is going to be executed so and I'm gonna type the time is dollar sign alarm let's press Ctrl D to duplicate this two times or three times and let's change the last one to one else all right let's change those values here to 7 and 14. now let's run this code to see what to get in the output and after that we're going to discuss our code so getting the output the time is 12 and we get that because what is what the when statement is doing it's using this argument that we passed here in this case it's our variable called alarm and it's comparing this uh the value of this argument with all the branches that we have here respectively it's going to compare it with the expression that we have on the left because on the left we have the expression the this Arrow sign is gonna is is uh saying execute execute this code on the right if this expression on the left is true in this case if our Allah alarm equals equals 12 and it's true we have a value of 12 so this branch is executed and it executes the code on the right which is this this the alarm is 12 but if I change this to 7 now and if I run this code I'm going to see the time is seven and if I change this to let's say 13. and here we have no 13 Dallas part is going to be executed similar to our if Daniel statement you know get the time is 13. so it was it was executed the else part now now and we can combine those uh Expressions by putting a colon and and we can combine them and putting them on on one single line so I can put here colon I can type here seven and fourteen now I'm gonna delete those two now it will check to see if our alarm argument has the value either 12 or 7 or 14. so um let's change it to 14 to see so now if you run this code you're gonna see that this will evaluate to true and this code on the right is going to be executed so again the time is 14. and if I change this to 7 again this level is true because one of those expressions show so yeah the time is seven all right what you can do next is we can check to see if a number is in a certain range so we can put another another expression here and and here I can type in the in keyword is used to check to see if numbers is to see if a number is in a certain range and to declare a range we type the range let's say that I want to check from let's say uh one from one to ten we put two dots dot dot 10. now what this is gonna do is gonna check to see if our alarm argument in the in this in this case our alarm variable is in the range from 1 to 10. now I'm gonna put a minus sign and a gray and a greater than sign to have the arrow and here I'm going to type the code that I want to be executing in this case it's just a printerland statement and I'm gonna type the number is in the range 1.7 now if you run this is only from here we get the time is seven because uh the first branch is checked and this branch is true and uh in effect it executes the code on the right and the next branches are left offs are not executed to and to change that let's put this first so let's copy this now if you run this code now get the number is in range one two ten and it's true our seven is in the range from 1 to 10. what you can do is also you can use the logical not operator so I can put here The Logical not operator which is an uh exclamation mark and this now will negate this value so if you run this code now you'll get the output 7. the time is seven so now we get the output the time is seven because this this switch is this value from True to false and execute this uh part now let's delete this what I can also do is that we can put curly braces so I can put curly braces press enter the same here and here also and it's recommended to use the calibrases only if you have multiple statements in your code in our case we have one one single statement which is this printerland which outputs some text to the console and the the when statement as I said can be used as an expression so I can type here a Val let's say your text and I can assign the when expression to our text variable now we need to give back a value to our text so instead of printing this text I can delete this let's put it like this now the last expression in our block of code which is now we have a single expression but you have multiple Expressions say that we have here another print Ln let's say some text so similar to our if then else expression the last line of code the last expression is going to be assigned to our variable text now let's print this down here torque console so let's type println and let's put director here text now if you run this code now I'm gonna see the text the number is in the range you want to 10 because it checks to see if this expression on the left is true then it executes the car the code inside the curly braces which is this expression and because now we're using the one as an expression it assigns this expression this text or variable text then it outputs that value with the print line down here in our console so you get the number is in the range one two 10. all right now but what if I want to put here a less than sign so you what if I want to put here if is less than seven our alarm argument I can do that the only way to do that is by uh let's delete this now let's put seven not here let's press Ctrl alt L to format the code all right now the only way to put a greater than sign or less than sine or greater than equal or greater or less than equal sign is to delete the argument here but let's first delete the curly braces to make things more clear so let's delete the curly braces let's delete this now because here we have two lines of course so we need to use curly braces this is why I deleted the penalion there and again you should always use curly braces if you have multiple lines of code but in our case we have a simple line of code which is the text on the right which is going to be assigned to our variable text and it's going to be output in the console so always use highly braces if you have multiple lines of code all right all right now this is more concise and more clear and let's say that I want to check to see if our alarm is less than say 10. um to do that we need to delete the argument here all right and now what can I do is I can put here our alarm variable and here I can put less than or equal to 10. so now here we have a Boolean expression on the left sorry so now we have a Boolean expression here on the left and this will check to see if our alarm or variable alarm alarm has a value Which is less than or equal to 10 which is true we have a 7 here so now if you run this call but let's delete this because we need to have now Boolean expression here because here we cannot uh here we have just literal types so here I need to put let's say if let's type alarm equals equals 8 or two vertical bars alarm equals equals seven so now if you run this code now you get the output the numbers in the range 1 to 10. because now this on the this expression on the left is true and it executes this text uh it assigns this expression to our variable text and it prints down here the that value so you get here the number is already one to ten but uh this condition is also true so if I swap those two so if I put this one below because as I said if one uh one of the expression evolution true the next ones the the one which are below so this in this case this one is true or not be are not going to be executed are skipped it only executes this code and the subsequent ones are omitted so let's put this below it's good to remember this so now if you run this code now get the time is seven because now this level is true even though this below is also true because our alarm is less than seven because this available is too true it executes the code which is on the right which is assigning this expression to our text and then it leaves the one expression it's not going uh down to execute the next one so it breaks uh like there and it stops it actually stops right there and it's not executing the next branch so this is our discussion about the when statement statement and the one expression see you in the next video now it's time to start a discussion about null ability in kotlin but first i'm going to create a new project I'm going to call it null make sure to have the language culturally select it and for the build system IntelliJ also make sure to have the jdk selected here and I'm gonna check this little box to generate the main function for us and that code that comes with the main function so I'm going to click on create to create a new project now our project is going to be great in a short moment so we got our project created and we get a log you get our main function Auto generated here for us because we check that box so I'm gonna delete this because I don't need this code and I'm going to hide the project pane so what is a null value a null value is basically when you assign to a variable nothing synthetically speaking you assign null to it but what that means is that you have a variable which has no value which has no memory reference and if you try to do some other arithmetic operation with that variable you're getting an impossible scenario where you have nothing try to do some work and that will throw a null pointer exception and this is particularly bad because the null pointer exceptions are only thrown at runtime and not at compile time so you could have your program working well and having no problems and at some point you try to I don't know press a button and somehow somehow that pressing of the button is using that variable which has another value and then it's going to throw an old normal pointer exception and your app will crash and kotlin aims to avoid the and to eliminate the null pointer exceptions and null values that is not to say that we can't have a null value in a kotlin but is very hard to have one so let's see why so what cotton has done to make null values and implicitlyn all pointerizations very hard to get it first made all its styles by default non-nullable and that means that you cannot assign null to it so if I declare here a variable called text I'm going to declare the type explicitly so it's going to be a string and if I assign null so to assign Alto where we'll just type the null and we have the null cured we can't because this variable by default and all the variables by default are non-nullable and that means that you cannot assign a value so if you hover over this underline it says null cannot be a value of a non null type string but what if I want to assign null to it what you if I want to have null for some reason in that case you go at the end of the type and you put question mark and that means that now you have a nullable type that means that you can assign null to this variable so if I put question mark here now I can assign null to this variable so this is how we can assign an altar variable by putting the question mark at the end of the type because that is saying to the compiler hey I'm gonna let I'm gonna let me to assign now to this variable so to avoid that underwriting red now if I try to print this so if I put here print line and I put here text what do you think we're getting the output and output to get null you know you don't get null pointer exception so now if I hide this and let's say that I want to get the length of let's say of the text so let's say that I assign here some text well actually let's put the name here name unless and if I try to get the length here so if I put here dot length I have an underline which says only save and we have this question mark that or not or asserted and have this this operator Cults are allowed on a nullable receiver of type string so it's saying that we can we can only get because you this this variable can have a null value but we know that it doesn't but the compiler is saying to us because we said that this can have null is saying to check first that this variable is not equal to null and then try to get its length and let's do that in the Long Way first so let's delete this so Alex actually just copy this and we type if we put parenthesis if text not equal to null then I'm gonna output this one we're then going to get its length so we're gonna type here text not the length so now that the compiler is happy because it's it's uh it's ensure that is not gonna have no because we checked here especially that this variable uh should have you should not have null in order to get the length so now if I run this I get four so this is the length so we have four letters here and I go I can also add the else part which is which is gonna say the very well it's not so if the variable is not the else part is going to be called so now if you run this will get also four but I'm gonna assign I'm gonna reassign this variable so I'm gonna change it to VAR first so we put here VAR and put here text equals null so now our variable is null and this check is going to fail and it's gonna execute the else part so if I run this code so we get the variable is null because now on the on the third line we assign nullity so this if fails and is executed there spot but as you can see it's a lot of code just to check to to check and imagine if you have multiple variables to check to always check for this that the variable is not normal then print its length and there is a shorter way in kotlin to do that and we saw as a suggestion how to do that previously so if I press Ctrl Z2 um undo our code so if I press still pressing now if I hover over this error that we had previously which says only save call so and you have this operator and this is called the safe call operator and if I put here just a question mark this is equivalent to having if which is checking to see if the length is null if and if the length is null then it's going to say null or and if it's not null it's gonna just output four so now if I run this so this is equivalent to the if that if the the if statement that you had previously so you have four so what if I should and if I assign null so if I type here let's change this to vardy First so if I assign here text equals null we'll simply get null we get null but what if I want to get that null pointer exception for whatever reason what can I do well the compiler or it helping is helping us also there so because if I delete that save call Operator which is just a question mark that and that is basically saying hey if this text is not null then output in the console then get then get the length and then output that in the console if it's null just say no so this is how the save call Operator works but if I delete this as you can see there is another operator and is and is this operator which is uh two exclamation marks and this operator is basically saying hey if this variable has null then throw that exception but if it's not null just output don't just output the length so if I put two exclamation marks here but for whatever reason it's not the our text that length is not getting the length and I think this this is because we assign to our text variable here null it it can't it has a prep it has a pro a problem with inferring what type this variable is even though here is saying that it's a string so we should we should be able to call that length and to avoid this you just put null at uh when you declare the variable so we assign here null so we put here null now if you run this because you have the two inflammation Mark operator now this will throw that null pointer accession that I talked about so we get exception thread main so it doesn't matter what trademark is now I'm gonna you get Javas like the null pointer exception so this is the the null pointer exception but if we assign down here this variable text equals some text and now if we run this code you get nine because this is the length of this so this is how you can use this operator the next operator that you can use is the Elvis operator and to show you how that works I'm going to delete this code now I'm going to declare another variable up here so I'm going to call it text two we put equals and we type text now to use the Elvis operator we put a question mark and the colon and now we need to uh type something on the right of the office operator so we put here some text I'm going to explain immediately how this works so I'm gonna type here some text now what the Elvis operator is doing is saying if this variable text is null then assign what is on the right to this variable text to if this variable text is not null then assign what is to this variable to our variable text to our variable text to and now let's uh let's type here text too and less the little length so now if you run this code let's actually put something more discrete like the variable null so if you run this code now we get a variable is null because it checked to see to to see if this variable on the left is null and if it is if it is now it's gonna it assigned this to to a variable takes two and then I'll put that in the console but if this is not null then it's gonna assign what is on this would what do whatever value this variable has to or variable takes two so if now I put here text equals this variable is not null now if I run this now this well this will evaluate to true so it's gonna assign whatever value is on the left or variable text to a variable text to and we're going to see in the output the variable is not null so we want a variable to X2 has now the value assigned from our for each variable so this is the shorter way of writing let me show you how we will write this in the longer way so you in the longer way you will have something like this so let's delete this quad actually yes let's delete this quad will have a variable called text tool and it's gonna have an empty string so we would what we will have to do without the Elvis operator we have to first check if text not equal to is not equal to null then I'm gonna call our variable a text to and we're gonna assign a text to it else we're going to assign to our text to variable the text this variable is null so this is the longer where we're doing of what we did previously so if I press Ctrl Delta format of code now if you run this you'll see the the same amount of the variable is not null so we get a variables not now and this is the longer way of doing the same thing so if I assign here if I assign actually if I delete this and the variable will have null let's press Ctrl Z if I run this foreign part is executed so our variable takes two it will be it will have the thesis variable this variable is null that takes assigned to it and then it's going to Output that in the console so this is the longer I was doing what was of what we had previously so if I press Ctrl Z to have the Elvis operator back so that was the longer way of doing what of what you're doing here in one simple line of code so this is our discussion about nullable types and uh I hope that you got a lot from this video and see you in the next video right now it's time to start a discussion about functions but first let's create a new project and I'm going to speed up the process now a little bit because we already did this a few times so I'm gonna call it functions should be in Pascal case select IntelliJ click on next and click finish all right let's delete the code inside the curly braces let's hide the project Pane and let's start by saying that until now we have written our code only inside the main function and occasionally we have called The Print line function to Output some code to the console but as I said at the beginning of our videos you can create your own functions in kotlin so let's see how we can do that so go down here at the end of our main function at the end of our enclosing curly brace and to declare the function we type the keyword fun we put space next we need to give a name to our function and the name of the function should say what the function is doing and generally it's a verb I'm going to call this function say hello and it should be in camera case next you put parenthesis because functions can take input to work with it and next you put curly braces because this is what we're going to put our instructions for our statements this is going to put our logic now let's add the print Elena statement here foreign and now let's run this code now as the input we don't see nothing here because if you hover this say hello function it says function say hello is never used because in order for that this in order for this function to be used you need to call it from main function and to call it from a function we type here the name of the function you can type it entirely you or you can type start typing you know IntelliJ is going to be it's going to give you some suggestions so press enter to fill and fill in that video and also press Ctrl alt L to format the code now let's run our code now you're gonna see that it says in the output hello because the main function executes in what's inside the curly braces and uh on the line two it sees that we have a function that we're calling here a function executes it executes the the say hello function the code inside the say hello function in this case it's a simple printl and a statement and then it outputs that to the console and it acts as the the code it finishes the process because you don't have anything else below for say hello but what we can do is put another say hello here to call our function again and now we're gonna see the output hello two times because now we're calling the say hello function first on the line two and second the line three so it will be executed two times so you can see that in this wave functions are reusable and are separate chunks of code okay which can be can be reused and you'll see that they can be used in specific cases now as I said functions can take input and to make a function to receive some input we need to Define what is called the parameter and to define a parameter we type the name of the variable first I'm going to call it name and we need to explicitly provide the type here so for the type I'm going to choose string and we need to explicitly provide a type here because is there there is no way for the type to be inferred here because uh the value that you're gonna pass to this say hello function is going to be here so it's impossible to know to what the kind of value are we going to pass to it so this is why you need to explicitly say what data this parameter or this variable is going to store so let's delete this second say hello now let's change the text that I have here in the println Let's uh let's refer the parameter name so put a dollar sign and start typing name and you can see that has this P4 parameter and press enter now what is going to happen now is that this say hello function is going to be called it's going to be executed from our main function and the code inside the say hello functions is also going to be executed and specifically it's going to execute this uh this uh text that we type here to be outputted it's going to execute the hello and then it is going to execute uh what what value if we have passed as an argument for this parameter and uh if you don't know what an argument is the argument is the value that you pass to the um to the function so in this case up here we need to pass some text so I'm going to put the name here not here it should be in a double rotation marks and you see that we have a hint here which says which is which says the name of the very of the name of the parameter which is name now what is going to happen now is this this say hello function is going to be called and this value that we passed here is going to be used in our println statement where where we're referring now which is uh here you here we're using the name and it's going to use that value and that value is going to be outputted down here and let's run the code to say now get Hello Alex because now it's using the value that you pass here as the as an argument to the parameter name and it's using that value down here where a we type the printerland statement or function now functions can take multiple arguments multiple arguments and to do that we need to Define I should say that you can Define more parameters for the function and a function contain multiple arguments and to Define another parameter we put the comma here and we type the name of our parameter is going to be age and we need to provide the type and I'm going to provide the type as anything yet because as an integer because it's going to store whole numbers and you're gonna put an exclamation mark and I'm going to type your age is now we need to refer the parameter age and also need to provide the value for that parameter now if you go up here now it says that you need to provide a value for the parameter has age it says no value pass from for the parameter a so here you need to type on a value for our parameter that we Define so let's say 22. all right now if you run this code now those parameters that we Define here are going to use the values the argument that we type here inside the our curly braces or how it's often called the body of the function or the code block so it's going to use the values here and here now another important thing to know is that you can not change the value of a parameter so if you type here age equals let's say 30. not gonna if you hover over here because you have an underline it says Val cannot be reassigned because those parameters are are declared as valves as variables false so that means that they are immutable we cannot change their values the only way to use the variable which can have is value changes to declare on so if you declare here a variable I'm going to declare it as a VAR to change this value I'm going to call it number and if I assigning healer value of 50 now I as you know you can change now his value to let's say 70. and you can also assign the parameter here to our variable number and now we can change its value because input number and can put another value here all right another important thing to know is that this variable that we Define here also the parameters are scoped inside the function say hello in other words they cannot be referred or accessed outside of the calibration of the say hello function so if I try to access that number variable here is not working if I try to access access here on the main function let's say type number I can because it's scoped inside the say hello function it exists only inside the say hello function the same thing with the parameters age or a name so in this way you can see that functions can be very useful because they are chunks of code which are reusable and flexible and to see an example with this let's declare another function down here let's call it the let's type the fun key or let's call it get data and this function is going to mimic the real function in a real app which can get some data from the internet of course that you're not going to get some other internet but we're gonna uh mimic that behavior so here I'm gonna Define a parameter let's call it data and for the type let's choose string right let's put the curly braces and here let's add the print Ln segments and here you're gonna print your data is and I'm gonna refer the parameter data all right now what I can do up here is to define a Boolean variable it's going to be a Val I'm going to call it has internet connection I'm going to assign a value of true to it now I can put an if statement here now I can check to see if that expression is true so I can put TV equals true or use the shortcut because it's better here I'm going to put the early braces and now I'm gonna call the get data function only if this condition is true so in our case it's true the but in a real lab that can be can be false so in that case you can do something else as you can assume we're gonna let's also other else part here and here we're gonna call another function which can which is going to be called in the case that there is no internet connection all right so above here you can personal logic to get the data from the internet well because this is a simple example gonna type here directly some text let's put some data and uh for the else part in the case that there is no internet connection that variable is false we can declare another function down here to oh and I'm going to call it fun show message and this is not gonna have any parameters it's gonna have only simple println statement and it's going to say that uh there is no internet connection all right so now let's go up here now and now we're gonna call the show message function in the else part now if you run this code you're gonna see Hello Alex which is our first function up here on the line tool your age is 22 and next to see your data is some data because it executes the say hello function then it declares this variable and it checks it checks to see if this condition is true and this condition is true and it executes this function get data so this is why you get your data is some data but if for whatever reason the user has no internet connection let's say you assign a value false to it to this now this function is going to be called show message so this function show message now is called and the code inside the show message function is called which is printerland with this sprinterland standard which says there is one technical connection area lab you can have some logic to show a dialogue that there is no internet connection and you can see that in this way with functions you can divide your code in different chunks of different different chunks of code which can be called in very specific cases so in this case we only call our functions only in in the case that we have internet connection or in the case that we don't have internet connection so in this way we have divided our code in different chunks of code which can be called in different uh specific scenarios and in this way we can write a program because if you just put your code all of your code in the main function and you execute that code from top to bottom you you cannot create a program like that so this was an additional discussion with the get data and show message and I hope that I'm not confused you a lot so see in the next video all right so in the last video we've seen how we can create functions how we can call our functions how we can Define parameters to our functions how can send the data to our function as arguments now it's time to see how we can return some data from a function but let's first read the code that we have here to make things more clear and the code inside the function the main function all right now let's Define another function I'm going to type the fan keyword space and it's going to be called get Max and this function is going to return the maximum of uh two integers so I'm gonna Define here a parameter I'm going to call it a in a real aperture those more descriptive names is going to be of type int and the next one is going to be called B and it's going to be also of type int I'm gonna put the curly braces and I'm going to press enter now to get the maximum value between these two numbers we type here we have here Val Max and here we type an if expression so we type if a greater than b then we're going to assign a to our Max variable else I'm going to sign B and in the case that the two numbers are equal B is going to be assigned to our Max variable now in order to return this uh to in order to return this value to our function we need first to to say to the function what kind of data is going to return and to do that go here at the enclosing parenthesis and if you don't have spaces here or you wondering about how to have the proper formatting you just press Ctrl alt L and the code is going to be formatted all right and here we put a colon and here we we Define why what type of data this function is going to return and in this case it's going to be an integer so we put in here and this is similar to The Way We declare a type for a variable now if you could if you go down here now you see that it says a return expression is required in a function to block body so now we need to return this uh now you need to return some data that we Define here in this case we need to return an integer and to return the maximum value to our function we type here return the keyword return and our value which is our variable Max and press enter now if you call this function in our main function get Max and now let's also press Ctrl alt L to format the code and here we let's say that we type two arguments for our parameters let's say that put five and nine now if you run this code now you're gonna see in the output nothing because uh in order to in order to get this value need to retain this value to capture this value in a variable and to do that we Define a variable in front of our get Max function it's also be a Val I'm going to call it Max and we're going to assign the get Max function to our variable and that is going to return or a maximum number now you now you may see that you have two names we have the same name here in the same and that is not a problem because this variable marks that we have inside the the get Max function exists on inside the the get Max function is scoped only here this is why you can use the same name here so if I try to type here also Max to declare variable which is going to be called Max I can't because it says completed declaration because if you because the compiler doesn't know if you assign a value let's say to this it will not know what variable to to to call because you have the same name but uh up here is not a problem because this is in the block of the main function so it exists only here and this exists only here now we have called our get Max function and this function is going to return the maximum of these two values which is nine now we need to print this value not console and to print this value just type here println and we're referring our Max variable now if you run this code you're gonna get nine because uh our get Max function is called the two the two arguments are passed to our function then the code inside the auto get Max function it's executed it Compares these two two numbers and if a is greater than b then it assigns eight or Max a Max variable or it's gonna if that is not true is going to assign the value of B and then it returns that max value to the to the function which is called so if this function returns that value here and and here we retain we capture that value which is returned from the get Max function our Max variable and then we print that Max variable with our println function or a statement and then we see the output in our console 9 right another important thing to know is that after we type the return call or the return keyword the the function is lift the function is stopped there so if we add the other text here let's say we add here a printerland and we type here some text we see that this is highlighted and it says that is this is a reachable code because after we typed our return marks our function is stopped is lived and it's not executing any any code below of of that return color or of that return keyword right another important thing that you can do with the return keyword is that you can return from a function without returning any kind of value and in that case it will have the same effect and that means that it will leave the function right there even though we don't return any kind of value so we I can type here return but let's uh the list here the type because now it's expecting a value to be returned and now this will have the same effect it will leave the function right there and it will not execute any any kind any line of code below of our return keyword so if I type here a println statement and I put some text here as you can see this has the same effect if you type the return keyword in your function it will stop the execution of the function and every line of code below of the return keyword is not going to be executed so it's very good to know this also another important thing to know is that you can we can only return a single value with the return keyword so we cannot return here to two integers let's say and also we cannot have two returns in the same function let's say if I put here also return marks I can't because this is also a reachable code but I I can have two returns two returns calls if they are rich in different branches so if I change this if expression to an if statement so if I type something like this if let's say a greater than b let's add the curly brace now we type here return a else return B so now we have two returns but they are never reached together they are they are always reached separately so this is why you can use here two returns because they said they are rich always separately so if you run this code you're gonna see the same output so you C9 so this is another way to to write the same thing that we had previously that but it's recommended to use a to use uh what we had previously because with uh specifically it's better to have enough expression another way to to write to the same thing but in a more concise way and let's undo the code that we have that you had previously so let's press Ctrl Z so now I have the code that help briefly now if you hover over over this Max it says variable use only in formatting return can be in line so if you click here in line variable now this thing does the same thing that it it was doing previously but this is a shorter way to write the same thing so now it returns a if this condition is true otherwise else part the else part is called and it returns B so we have the same thing but written in a shorter way all right another way to write the same thing that we have here is by using what is called the single expression function and to do that we can remove the curly braces we can put our code up here you can remove the first curly brace and you can also remove the return keyword and here you put equals and this now does the same thing that the code the previous code that was doing but this is a more concise way and it's recommended to use this only if you know that you know you have in your function a single expression or in other words if you know that you have a single line of code and you can also remove the type here because the type can be being inferred and again only use this if you know that you have in your function a single line of code and in that case you can you can skip the return keyword but if you have multiple lines of code you should always use the curly braces and the return color the return keyword all right so this is our discussion about how we can return a value from a function all right so now let's continue a discussion about functions and now it's time to look at what is called function overloading and let's say that I want here to pass not to integer types but two doubles to be compared so let's say that type here 6.5 and 9.6 now this will not work because it's defined here explicit that the parameters are of type int so we cannot pass here double and a solution to this it may be to create another function the different name and to define the parameters as doubles but that does not make a lot of sense because we we are doing the exact same thing so does not make sense to create a new to create a function with a different name so what you can do instead is to let's change it back to integers is to duplicate this get Max function and do that you can press Ctrl D or command line on Mac some press I'm going to press Ctrl D here now what I can do is change the types of the variables so I can put here instead of integer I put double and here I can put also double let's add the space to make things more clear now if I pass here let's say your 5.6 and 9.7 now you see that we have an error so if you run this code all right so we get in the output 9.7 and this is called this uh is bigger than 0.5 or 6 but now it's using the second function which is the function which has the parameters as of type double and you can see that this function now which is using the parameters as integers is gray out because the compiler can figure out what function to use by the argument types we pass here so in this case we pass here doubles and it knows that it has to use this function which has the types which has the parameters Define as type of double right another way to overload the function is to best also press Ctrl d is by changing the number of parameters so I can put here let's say also integer also releases so let's pass another the third parameter now and this is also going to be an integer it's going to be called C gonna be of typing all right now let's change this logic to any statement so let's delete the if expression let's put the curly braces all right so let's change this now so you can type it here now if a greater than equal to be and a is greater than equal to to C then I'm going to return a so now we're using the return keyword else if now putting here an lcf B is greater than equal to a and B is greater than equal to C then return B else C is going to be the bigger value so put here return C all right let's press Ctrl alt return B here right so I need to put here the type this will get that error right now everything is okay oh so from here is the problem all right so now if you run this code let's change this to let's say five seven and 10. now if you run this code you see that the two functions above our big gray out and I was going to use the third one which has third parameters all right so when you get to get in the output 10 which is correct so if you change this to test let's say if we put here 100 let's put here three and if you run this code now we get 100 and this is correct all right so this is our discussion about function overloading and you can use function overloading every time you know that you will do the same task but with different type of parameters or with a different number of parameters also you may have noticed that we have another line over uh over if over the statement so if you hover over here says that the return can be lifted out if so if you click this you can write it in this way so or we can keep it in the previous way but because this is uh underline that means that kotlin recommends to use it in this way in this way so see you in the next video what we're going to talk about default parameters all right so now it's time to look at another features that you can use with functions and that is called default parameters and let's first declare a function so I'm going to declare it down here at the end of our enclosing curly brace for main fun I'm going to call it send message let's put the parenthesis and inside the parenthesis I'm going to Define two parameters the first is going to be called name it's going to be of type string and this second one is going to be called the message and it's going to be also of type string now let's uh you take the cloud the curly braces press enter and let's print those parameters in our console so let's put the printer line here and inside the also uh while I'm typing while I'm pumping this printable anime since that this println function is a function which is overload referring to our previous video because you can see that it can it has the same name but it can take different types of parameters here so it has in this thing which is any bytes or Char long so the print element 5 function that you've used throughout our videos is overloaded this is why you can pass different uh different types of of data to it now let's type here println quotation marks inside the quotation mark we're going to type name equals dollar sign name so now it's going to print the argument values that are going to pass to this function as parameters now let's call this function here so let's type send message to format our code and here I'm going to pass a name let's say Alexa and the message let's say hello now if you run this code you're going to see in the output um the name here is going to be this argument that we type here which is Alexa and the message is gonna be hello so we have this but let's say that for whatever reason the user doesn't want to to send any kind of message but we still need to use this function what you can do then one way is to remove this parameter all the way but uh that is not the good because you still need to use this function with those two parameters the name and and the message so you know let's say that if the user doesn't pass any message we can Define here what is called the default param a default parameter so what you can assign here a default value for our parameter so I'm going to put here uh just the double quotation marks or or you can put some text here but let's put just the double quotation marks which is just an empty text so if now I don't pass a message here now we're still gonna work because as a value for this parameter is going to use the default value that we defined here all right so let's run this code to see now how it works so now get name Alexa and message equals empty because m double quotation marks without any text is an empty text now if I want to pass here now the message now you can pass here the message and now our default value is going to be replaced with the argument value that we typed here so now I'm going to see name Alexa message hello all right you can do the same thing for uh for the name so here you can Define let's say that the user doesn't want to to type a name and we can define a default name let's say user yes now let's say that I delete both arguments here and I just have an empty function if I run this now it's going to use the default values that you type here respectively user and this empty string so now get name user and message now let's put back what we have so let's put here Alexa let's put our message here again now let's run this code again now what we can also do is use what is called named parameters and let's say that I want to to pass a parameter only for the second second let's let's say that I want to pass the argument type for only for the second parameter that we Define here respectively for our message so if I delete this now I'll say let's say that I delete the the argument for our name and if I want to pass the value only for the message let's put in the quotation mark because the string let's say I put the message hello here now you can see that the hint is named so it's using the first parameter that we Define here another second so what we can do now to pass a value to only to our second parameter because as you can see it's using the it's assigning this value that we type here for this parameter and to solve that you can use what is called the name parameters so with name parameters you can type an argument for our parameter irrespective of the order in which they are defined so in our case we have the name for Define and then the message so to use that you can type the name of the parameter let's say message now you see that you have this P message and it's equals to A String so that means that you need to pass some text here and now we can pass here hello and now this is gonna work because now we can pass a value to our parameter irrespective of the water in which they are defined here right so now I get name is this default user and the message is hello and we can do the same for uh for the second one which is name so I can put now here name and I can type here let's say Alexa and if you run this now get Alexa is the name and the message is hello so with the named parameters this is how they are called a name arguments we can pass the value to our parameters irrespective of the order in which they are defined in the function so in our case name is first defined and you saw that that when I try to use a the message to assign a value only for the message it's what it was using the first parameter because this was the word in which they were defined but with this named parameters you can change you can you can type an argument irrespective of the word in which they are defined and you can put this in a multiple lines to make it more clear like this let's say so this is our discussion about named parameters and the default parameters but before we win the video I should say that to the default parameters we cannot only type literals values like we typed here some values directly we can use variables or you can use a function which can return a value so I can Define here a function let's say fun send the text it's not going to have any parameters it's gonna return a string so I'm going to Define here a string as the type of return and here gonna type return and let's type some text now we can call this function here send text and now this value which is returned for this function send text is going to be assigned to our parameter message so now if you run this code Let's uh increase this a little bit so now if you run this code you're going to see that the Now the default value for the part method message is the return value from our send text function so you can see now that we have okay so let's change it here to no value for our message so now if you run this code because there we have an argument passed so let's not passing on the northwest so now it's using the value that we was was passed as the default value for our parameter which is this return value from this function now because here you have one single line of code we have one single expression we just return some text or function we don't have multiple statements in our function we can write this as a single expression function and you can remove the calibration you can write this as a single expression body like we did in a previous video so you can put it just equals and you can remove the type here also so if you run this code now I'm gonna see it to the output for the parameter message some text which is the value which is returned from this function from the single body expression function right so see in the next video all right now it's time to look at the VAR Arc keyword and how we can use the water keyword with functions but first let's declare the function below of our enclosing calibrase of our main function so I'm going to type here the fun keyword to declare a function I'm going to call it sum because it's going to return the sum of all the parameter that we're going to Define so I'm going to Define here some parameters for it's going to be called a it's going to be of type int a single second is going to be called B also in third is going to be called C also an end the final one is going to be called the alternate and this this function is going to return the sum of all of those parameters so we need to Define here the return type which is going to be an hint a whole number and now we can put the curly braces and here we type return a plus b plus c Plus d and this is going to return the sum of all the parameters that we Define here or the values that is going to be passed as arguments to this function and you can write this as a single expression function if you want so you can write this uh like this if you want this will have the same effect but I will I will write it with the curly braces because it will make things more clear so let's undo this right now let's call this function here sum let's press Ctrl alt L to format the code and let's pass some values here so I'm going to type here five six seven and 10. all right if you press shift Ctrl p on this you're gonna see that the type of this function let's press again the type of this function is an ins so this function returns an integer so it's it's an expression that means that we can put this instead of putting storing um uh the return value in a variable we can put this direction a printerland function so you can type here print area and we can put the function inside here because that function is of type in so it's going to return the sum of all the arguments that we type there so now if you run this code we got we get 28 because 5 plus 6 Plus 7.10 is 28. now if I want to pass another parameter here let's say that I want to pass another number here I can't because I am limited by the number of parameters that we Define here of course that I can Define another parameter here but what if I want to pass 10 numbers for 15 numbers or 100 numbers in that case it will be very tedious to write all of those parameters and and to solve that you need to use what is called a varg varag keyword and Avada keyword allows us to pass more than one parameter actually more than one argument to our parameters so to declare a Vari keyword we type here we type here far ARG so this is the keyword varag it stands for variable arguments now we need to define a name for this bar Arc I'm going to call it numbers and we also need to specify a type what kind of values this varag is going to store now this return keyword is this variables here are red because they don't exist now if I want to but first let's say that I want to type here another parameter now now you see that we have no problem so I can type here whatever number of numbers I want and there is no problem as you can see now to to sum the values which are stored in these viral numbers we need to use something which we didn't cover yet but we have a separate section which I show you how to we need to explain this thing that I'm going to use now and that is Loops because now we need to Loop through our numbers and to add our numbers to a variable so we need to use what is called a for Loop so to do that first we declare a variable I'm gonna call it um let's say uh result I'm gonna assign a value of zero now to use a for Loop we Type 4 and again I'm gonna go into more detail about this in uh the separate section but now we need to use this because there's not another way to to sum up the values inside the varag numbers and here we need to define a name for our variable so it's going to be called number and now we use the keyword in and now we're referring the parameter the varag parameter which is defined up called numbers all right now we here you can put the curly braces and inside the cutter blazes we're going to type numbers result and now we're going to use that abbreviation which is plus n equals plus equals number n now here gonna return the result return result all right so let's explain what we have here so first we declare a variable we assign a value of 0 to it so it's just type int next what this for Loop is doing so this for Loop is doing what is doing is executing um a line of code multiple times so it executing is executing uh uh what's inside the curly braces until the it finishes to it finishes the to Loop through all these numbers which are stored in the varark number so it first assigns uh the first the first number or number here and it loops and it has that it adds that number to a result then it does that again and again and again until it finishes so then it reaches uh the final number five and in that case also gonna sign from our numbers uh the number five to our number and then that number is going to be added to our result variable and when it finishes uh that looping when it finishes that thing is gonna return the result it's gonna return all the values which are which were been added to our result variable so now if you print this now I get 85 and probably this is the result of this calculation so this is how you can use varag numbers what are the keyword to store more than one single more than a limited number of parameters defined bio and another short shortcut to to Loop through this is using a for each Loop so we can do something like this but this time let's say that I want I don't want to return something so let's see that I delete this and I I can type here actually numbers four dot here to put that four each and here we type print Ln again this is a more complex subject which is going to be covered in the next videos so here we type print Ln and we type it all right now let's uh let's call our sum let's define some numbers here let's say that I type here one four all right so if you run this code now you can see that every number in that that we defined here is printed one by one so this number this for each which is also a loop it goes through all of these numbers it and it prints them one by one and again we're gonna look at uh for the for Loop and the four each in the next videos but I had no other way to show you this example without using them but if you feel confused by for the for each or the for Loop don't worry we have a separate section which in which you talk about in detail about this for now we need to only the only thing you need to know is that you can pass an indefinite number of parameters of actually you can pass it an indefinite number of arguments to our varag numbers because this allows us to to power to to pass uh an indefinite number of values so here you see that we have one four five six seven eight nine five seven and six numbers that we have here so this for each is going through all of them and it prints them one by one so see you in the next video all right now it's time to start our discussion about loops but first let's create a new project I'm going to call it loops select IntelliJ click on next and finish right a project is created let's delete the code inside the color braces let's hide the project pane and let's start by explaining what Loops are and why you need to use them so Loops allows us to execute a piece of code multiple times without you writing down every line of code manually so let's say that I want to print 10 numbers in the console or 20 or 50. instead of printing instead of typing that code manually move line by line which will be very tedious you can use a loop and you can put that code in a loop and in that code in the loop it will be executed repeatedly until a certain number is reached so let's see how we can define a loop to define a loop we type here four this is the first Loop that we're gonna look at because there are other loops so this is the for Loop we press enter inside the parenthesis we type I this is convention you can put whatever name you wonder now we put here in this is the keyword in and now let's say that I want to loop from one and from 1 to 10 and to do that to type 1 dot dot this is a range one to ten now I put a curly braces and inside the pre the curly braces and I'm gonna put the code that I want to be executed 10 times so I'm gonna type here println and I'm gonna type the value of I at each iteration and uh we can put it like this you can type here uh you can put in the quotation marks and you can do the placeholder you can put I so now if you run this so now I get is one two until 10. so it what is doing is is looping through this range until it reaches 10 then it stops now uh you can write this I like I did here using a placeholder where you can write it like this I've run this code it will have the same effect but will not have the taste before here so now you get one until 10. now there are other other very variations to use this range and one of them is to use until so let's uh command this code so let's press Ctrl slash right now let's type 4 again and now I'm gonna I'm gonna call it also I here you can put whatever name you want and instead of now I'm going to put also again the in keyword and instead of putting the dot dot to Loop to arrange I'm gonna put one until 10. all right now I'm gonna add the printerliner statement and here I'm going to type I and this will have the same effect with the thing with a single difference that 1 until 10 is is gonna exclude ten and one uh using the range.10 it will include 10. so if you run this code we're gonna see that you will not have 10 here because 10 it is excluded when you're using the until so now as you can see we have one until nine and then it's excluded because now we're using the until so if you if you're using the range which is uh dot the last number is going to be included but if you use the until the last number is going to be excluded so it's important to know that this two respectively the until and the range can only count upwards so we cannot put here 10 until 1 because the first number the number of on the left needs to be smaller than the number on the right so we cannot put 10 until 1. we can only count upwards you can only put one until 10 or 1.10 so to Loop backwards we need to use another thing so let's comment this code also now to Loop backwards we Type 4 again in the paradise you put the I here you can put whatever if you want in so here you can put whatever name but the convention is I issues now I'm going to put in and now I'm going to put down first let's put uh 10 down down to one let's add the curly braces the printerland and let's put I here now this is gonna this is gonna count downwards now it's gonna it's gonna count from ten to one so if you run this code now get 10 9 so it's counting it's it's counting backwards right another thing that you can do is that you can introduce an arbitrary step so let's uh let's comment this code also let's add below another call another for Loop so here I'm gonna type four parenthesis let's put I and let's use uh done TL so in one until 10. so now I can put a an arbitrary step so at uh at this arbitrary step that number which is that is that is at dotted arbitrary step is going to be skip so I can put here step to let's say so now I'm gonna put the quarter Blazers to have the some code executed I'm going to put println and let's put here I so now if you run the squad I get one three five seven and nine so you can see that uh at the second iteration the number is Skip so we have one two is skipped now we have then we have three four three and four skips and so on so you can put this arbitrary step if you want so let's comment this code also and let's add the first code that we had here to to talk a little bit more so let's put I in one let's put the range Dot 10. and curly braces you're gonna type println hi now if run this code we'll get the same output that as at the beginning of the video so get one until 10 inclusive now again what this uh loop is doing is going through this is going to this to this range from 1 to 10 and it's executing the code inside the curly braces 10 times and when it reaches 10 it stops and it executes the next line of code below here that because here we don't have any line of code our program X is exited and is finished so this is our discussion about for Loop there are other Loops which can Loop which can loop as long as a certain condition is true not as long as a certain number is reached so we're going to look at the next Loops in the next video see you next all right now it's time to look at the next two Loops that you can use in quadrant and those are the while and the Dual Loop but first let's open our previous project called Loops because I'm going to type my code there so open your previous project and here I already have deleted the code that we had previously here but if you have the code delete it and let's start our discussion about the while loop so first I'm going to type while this is this is how you declare the while loop and here you can press enter to fill in the the wallykid on the parenthesis for you or you can type manually the while and the parenthesis so I'm going to press enter to fill that for you fill in that for me and next you put a space and you put curly brace here so I'm going to put the left curly brace and press enter and the radical base is going to be added automatically as you can see on the line five now a while loop Loops as long as a certain condition is true in contrast to the for Loop which Loops for a specific number of time while a loop Loops as long as a condition or an expression is true so this gives us more flexibility in a circumstances or you don't know for what specific number of times we want our code to be repeated so we put our condition inside the parenthesis here and as long as this condition is true the code inside the current base is going to be executed repeatedly so let's see how we can do that so first let's discard a variable here I'm going to call it number and I'm going to sign a value of 0 to it and here I'm gonna type while number is less than 10 inside the calibration I'm going to type the println function and we're going to Output the value of our number and then we're going to increment the value of a number so I'm going to put number I'm going to use the increment operator plus plus let's put a space here to have things more clear now if you run this code you're going to see the numbers from 0 to 9. so what is happening how this works first with the color variable with a sine of value of 0 to it next we Loop using the while loop and first the while loop is checking to see if this condition inside the parenthesis is true so it checks to see if the value of our variable number is less than 10 and it's true because we have zero then it executes the code inside the curly braces and it outputs the value of our number in the console using the printerland function then it increments the value of our number and then it Loops again but now the value of our number is one so now it will compare again if the value for number is less than 10 which is true it will loop again it will output its value it will increment this value so now we have two and so on until it reaches nine when it reaches 9 it will increment the value it will it will print it will output the value in the console it will increment this value then it will check again to see if this condition is true but now the value is going to be 10 because not it was incremented when it was nine and this condition is going to be ever it's going to evaluate to false and the code inside the cutter base is not going to be executed this way we don't have 10 here and it executes the code that comes below of our while loop but because you don't have any code the program is terminated and you can write this thing in one single line but it's recommended to use this form only if you know that you have one single statement in our Loop so if I can delete this this tool and I can put here directly number plus plus and because this Returns the value it increments the value and it Returns the values and expression I can I can run this code and it will have the same output but if I delete the increment operator out after the variable and if I put it before now I'm gonna see a different output here because this increments the value of of our number then it decrements the value of our number and this is called prefix in increment increment so this is called prefix incrementing and the the previous one let's press Ctrl G this is called postfix increment so this is postfix because it's the end of our variable and uh if you put the incremental operator at the beginning of our variable is called prefix oh increment anyway let's press Ctrl Z to have the code that I had previously and the curly braces now look what happens if I delete the increment if I don't increment all variable now now uh let's just talk what is happening because we don't increment the variable and the variable always has the value of zero this will always be true and it will execute the code inside the current places forever so we'll have what is called an infinite Loop so if you run this code now you can see that it prints 0 forever because this condition never ever has to to to false so let's stop this by pressing on this uh Red Square so now the process the program is terminated so this is why you need to increment the value of our number because we want that condition to be false at some point in the in the in the in the future next let's say that I assign here 10. so if I run this code now this condition is going to be false because 10 is not less than 10. and the code inside the curly brace is not going to be executive so now we have no output here because this condition is evaluates to false and is not executing the code inside the calibration but there are certain situations where you'll want to have your code executed at least once even though the initial condition the initial uh condition or there is expression is false so if I delete the curly braces and the code inside the curly braces here now to to do what I said if to execute the the code even though the condition is initially set to false to execute the code at least once you need to use a do while loop and to use a do while loop you put here at do press enter to add the calibrases and we put our while at the end of of our enclosing curly brace of Urdu and here inside the calibration or I'm going to put our printerland function and I'm gonna output the value of our variable number so now if you run this now get 10 because this executes the code inside the curly braces until at least once and after that it comes down here and it checks to see if this condition is true or false and if this condition is true it will repeat the code but if the condition is false it uh it will not repeat the code but the important aspect here is that it will execute the code inside the curly braces at least once irrespective of our condition if the condition is true of order false in our case is false so these are the three Loops that you can use in a kotlin the for Loop the while loop and the do while loop now it's time to see how we can use the continue and the break keywords with those Loops so let's press Ctrl Z to undo the code have the while loop back because I'm going to start the while loop and to see how we can use the but you can continue cured with the while loop let's bring this up a little bit so let's first look at the continue keyword and the continue keyword can be used to bypass a section of code so let's say that I want to skip the number seven in our Loop so I can type here if our variable number equals 2 so 2 equals seven let's put curly braces press enter toward the right calibrase continue so now what this is gonna do is when it is gonna reach the number seven and this condition is going to be true it's gonna call continue and it's going to bypass the code that comes below of our if statement so if you run this code look uh what happens it happens nothing because uh here our number has a value of 10 so this condition is false so the code is not executed so let's put here zero now if you run this code so we get 0 1 2 3 4 5 and 6 but uh and you see that I save at seven it uh it skips the code but why I don't have the next numbers this is because uh unintentionally we created here an infinite look so let's stop this and uh to explain so what happens here is that because um we said we say here explicit to you to check here explicit we check here to see if our number is equal to seven then we're gonna continue and in other words you're gonna skip the code which comes below of our of order is the then statement then this code is never called so this code is never called the printerland and more importantly the increment operator is now never called on our number variable and because of that because our variable is not incremented here either when it's gonna loop again it will have again the value 7. so this condition or the in the if is going to evaluate again to true and it's going to call continue again and because this code again is never reached Discord and the values no not not incremented it will still have the value seven so this is gonna evaluate again to true so it does this forever and to change that we need to put our number and which is incremented before our reef and that is going to solve the problem so now if I Let's uh now if I run the code let's increase this now get one two three four five and seven is skipped then 8 9 and 10. because now when this condition level is to true it will continue it's not going to print the code it's not going to be executed below of our if and it will come back to Loop and now it's going to increment the value and the value is going to be 8 instead of 7 this is going to evaluate to false and the continue is not going to be called it will print the number eight and it will do the same for it it will increment the value again and then we'll have 9 and so on so this is how you can use the continue keyword and you have to be careful where you put your in uh your whatever incremental variable because I you saw you can easily get intro infinite Loop now you can have a more complex expression here so you can put here if number is greater than let's say 2 and number is less than eight now if you run this look what happens now get one two and then we get 8 9 and 10 because what this condition now checks is is if our number is greater than 10 and less than 8 then continue then skip that number so this is why the numbers between 2 and 8 are skipped because we call continue on on them and if you hover over here you see that it says the two comparison should be converted to a rain check so you can write the same condition that have here using a range but this is different from a range that you you've used in a for Loop in the sense that this is now checking to see if our number is in the range 3 from 3 to 7 so if you run the squad now I have the exact same output but now we are using the range to check to see if our number is in the other engine if this is the underage we call continue to skip that um the next thing that you can do is you can break the loop you can stop the loop using the break here so I can say here again if number equals equals let's say seven call break so I'm going to type here break now when this condition is going to vary to true it's gonna call break and the loop is going to stop it's not going to execute any line of code after that it's gonna stop it's gonna leave and it's going to execute the code which comes below here but in our case we don't don't have any code so you see that we have one two three four five and six and when it reaches seven it breaks and it nuts is stopping the loop it's not printing the value and it executes the loop so it terminates so foreign and we can do the same thing with the for Loop so we can use the four we can use the continue and and break with a for Loop so you can type here four let's say I in let's create the let's say zero to 10 let's create this range let's add the curly braces now I can say here if I in let's say three to eight then continue let's put in the volume let's type here println let's print the value of I here so now if you run this code so we have our first Loop which Loops a to six and then it breaks because you call break there then it's using the for Loop it Loops it loops from 0 to 10 but because here we're checking to see if our number is in the range three to eight and skip it you get 0 1 2 and then the numbers uh the three and uh the numbers between the three and the numbers between 3 and 8 inclusive are skipped here so we have 0 1 2 and then the numbers between two and nine are skipped and we have nine and ten and we can use also the brake keyword with the four I can put here if I equals equals seven break [Music] so now if you run this code now you get 0 1 2 3 4 5 6 and when it reaches seven it breaks similar to our while loop so this is how you can use the break and continue cured with the while and for Loop and you can use the brake and continue cured also with the Dual Loop next we're gonna look at how you can Nest Loops within each others and we're going to look at an example using the while loop so I'm going to delete the code of the for Loop and the printable statement there I'm going to delete the if then statement the break yard and I'm going to bring the printerland function up there down here I'm going to declare a variable it's going to be a VAR I'm going to call it I and I'm gonna assign a value of 0 to it now in inside the while loop I'm going to type another while loop here I'm going to put a conditional while I is less than 5 we're gonna increment I and we're gonna print and output the value of I in the console but let's put some text here to make uh clear what Loops what Loop is looping so I'm going to put three asterisk signs here I'm gonna type the dollar sign and I so now if you run this code let's also change this condition too less than five so if you run this code now we get first you get one then we get our code inside of our inner while loop which is the three asterisks and get one two three four five then it Loops again but let's take this chord line by line to explain what is happening here so first decade is variable call number assign a value of zero to it then we Loop using the while loop the outer loop and it checks to see this condition issue and is true zero is less than five so it executes the code inside the curly braces and it increments the value of a number by one then it outputs the value of our number in the console so you get here one then it declared this variable called I and then it starts looping inside our outer loop while using the inner loop while so it Loops here five times so when it finishes it goes back and now the value was incremented by one it will check again if the condition is true it will uh execute the code inside the calibration to increment the value now so the it will have two it will output that value so now we have two here and then it will loop again five star five times using the inner loop and it will do the same thing for the next round and the next round until you get to 5. when we'll get to five five will be not be less than five and this condition will evaluate to to false and the code inside the caliber is not going to be executed right and you can use the break keyword inside the inner loop so I can say here if you can put it above here so you can say if I equals equals zero then break and now you can put the break and continue cures in one single line if you want you can avoid the curly braces so now if you run this code now get one two three four five because now uh when it reaches the inner loop it breaks immediately what every at every iteration in the outer loop so when it comes down here it will check to see if the conditions through is going to be true but when it gets to the if statement it will break it will stop the loop so it will execute only the Outer Loop and with a break keyword you can not not Target only the loop so with with this break keyword we stop you stop only this while loop that uh that we are currently that is currently the nearest Loop but there is something which which is called labels and with labels you can Target an outer loop so it can break the outer loop here so you can break the while loop which is here and to do that we we give to our while loop a label so we type here a name I'm going to call it outer and we put at now here you can put break and now I'm gonna type add and you put outer and this this should be a single word now if you run this look what happens now get one because it breaks the outer loop so it first evolves this condition it increments the value of our number it prints the value of a number and then it goes in the Inner Loop it checks to see if this condition is true it's true then it's checked to see if I is equal to 0 which is uh true then it breaks but now it's not breaking this Loop this inner loop it's breaking the Outer Loop so it's breaking this Loop so this is why you get only one and the code is not executed because it breaks the outer loop and the code our program or code it's terminated because about down here we don't have any code so this is how you can use labels with the break keyboard to Target an outer loop and the labels can be used also with the continue keyword and in other Loops that we've looked at so this is our discussion about loops what you can do I should say is that you cannot Target with the labels and inner loop from an outer loop so you cannot we can give here a name to a label to our inner loop but you cannot Target our inner from our outer loop so this is our discussion about loops and the next video we're going to do a challenge all right so now it's time to do a challenge using all the knowledge that we have accumulated so far and I'm gonna use the previous project to put my code there but if you don't have the previous project you can create a new project and give it whatever name you want and type your code there so I'm going to open my previous project I'm going to delete the code inside the main function now what is the challenge the challenge is to create an arbitrary range of numbers then we need to find a way to go to that arbitrary range of numbers and to determine if a number is an even number or if a number is another number and based on that if the number is an odd number skip that number but if the number is an even number then output a number in the console additionally should create a way to count all the even numbers that you found in your range and display the total number so if neither numbers um at the end of your program so try to do this solution and after that you can watch my solution to this so first I'm going to decide I'm going to declare a variable call number I'm going to assign a value of 1 to it next I'm going to declare another variable but this is going to be a Val it's going to be called last number and it's going to have a value of 20. now I'm gonna Loop using the while loop and in the parantes you're going to type while number is less than equal to last number then you're going to put curly braces now I'm going to increment our number now here you need to add the logic to determine if a number is an even number or not and to do that I'm going to add the function at the end of our enclosing curly brace of our many functions so I'm going to type here the fun keyword now you need to give a name to our function it's going to be called is even number I'm gonna put parenthesis and it's going to take a parameter called number of type int this function and it's gonna return a Boolean value true or false this function so you put colon and we type Boolean then you put curly braces and now we'll add the logic to determine if any number is even or not so you type here if and now inside the parenthesis we put another set of parentheses and here we refer our parameter number that we have defined above and here we put the modulus operator because the modulus operator gives us the reminder of a division so we put a modulus operator 2. now outside our inner parenthesis we put equals equals zero then we put curly braces and return true else we're gonna return false now how this logic works so our num our number parameter which is defined here it's going to take an argument let's say that it's going to take an arbitrary number then he's gonna check to see if that number divided by 2 has no reminder if it's and if it has no reminder then that number is an even number because the because even numbers when they are divided by two they have no reminder and if that is the case if the reminder equals equals to zero our number is an even number and it's gonna return true and their spot is not going to be executed now let's add the logic here list user function here because as you can see now it's uh gray out it's not used so let's type here if and in the parenthesis you're gonna type is even number our functions we're going to call our function here and we're going to pass a parameter to it called now I'm going to pass the parameter we're going to pass an argument and the argument is going to be the variable that we Define above as you can see you have the V there so press enter to fill on that for you let's press Ctrl alt L to format the code now if we press shift Ctrl p on this you're going to see that this is a Boolean expression because this returns true or false so we can put the logical not operator in front of it to change its value to switch his value from True to false and from and from false to true so let's put curly braces and here we're gonna call our continue quick keyword down here I'm gonna add a printerland which is going to Output the the number in our console next we need to add the logic to to count the total uh the total even numbers which are found so I'm gonna declare a VAR it's going to be even numbers counter and I'm going to assign a value 0 to it and here we're gonna increment our even numbers counter so now if you run this code we get 2 4 6 8 10 12 14 16 18 and 20. so these are the even numbers that they are that they found that the our program found in is correct but let's add a print line at the end of our Loop to print the total number of numbers of even numbers found so let's put println here and let's put let's refer our even numbers count here you have a numbers counter so if you run this let's put some text actually let's put this in curly braces so let's type here total number of even numbers found equals dollar sign now if you run this now you get total numbers of you know when even numbers found this 10 and this is correct so in an output correctly or even numbers and it show that the total number two newer numbers found this 10. so let's now think about how this logic works here so let's look at the if statement that we have here so what is doing in this thing here so let's take an um an um specific example a specific number to store to see how this works so let's see that here we pass four and it's gonna use the logic to determine if this number is an even number and if that number is any of a number is going to return true so this this function which is a Boolean expression is going to return true and then we're gonna negate this value gonna change this value from True to false and continuously not gonna be called and the code which comes below which is uh our variable which uh counts how many even numbers uh we have then it it increments then it outputs that number in the console so we have our even number four output output it in the console but if you pass here 3 that the number is not going to be an even number because has a reminder and this is going to return uh false and because of here you put the logical not operator that is going to be switched to true and the continue that's going to continue keyword is going to be called and our code Channel which comes below here which is uh our variable even number counter is not going to be incremented and our number respect to our number three now it's not going to be outputted in the console so this is how this works so this is our solution to our to our challenge of course you can simplify this so if you hover over here because you have all of those underlines you can see that says remove redundancy if statement so this can be simplified to this this does the exact same thing it is going to return true if this uh divided by 2 has no reminder otherwise it's going to return false and this can can be simplified even further because if here we have a single expression and we know when we have a single expression we can write our function as a single expression function so I can remove the curly braces here you can remove the bully return type you can remove the return keyword I'm gonna put the equal zero and this now if you run this code this will work the same so we have the same output here now I use the function here because we've talked about functions in our previous videos but you can remove the function completely and add the logic to determine if a new number is even or not directly in the if statement so you can put here if let's put parenthesis our number now we're going to use the modulus operator tool not equal to zero then continue and this will have the same effect so if you run this code this will work in the same way so we have the same code here because this does the exact that the function did previously it will check to see if this is a new number if this is any of a number the this is not going to be true because hero checking to see if this is not equal to zero and our number is equal to zero so this condition inside the parenthesis is going to be false the continue is not going to be called and the our code below is going to be called our even number counter is going to be incremented and our number is going to be output in the console so this does the same thing as previously and we can do this challenge also in the first of the four Loop if you want so you can type here four I in one to 20 then execute the code inside the curly braces and here you can check if parenthesis again if I present 2 not equal to zero then call continue then else is gonna execute the code which comes below here which is let's first assign a value for your to a even number counter to zero because where when we're gonna enter in the for Loop we should have a zero to not have the previous value which was 20. so let's put 0 here and here you can increment or even number counter plus plus and we're gonna print our even number so I'm going to print I here so if you run this code let's run it from here but let's add the printerland to make things more clear so I'm going to add here print let's put quotation marks and here I'm gonna type total number phone using four Loop r let's put the dollar sign now let's refer our even number variable now if you run this now I have the exact same output but now we're using the first you're using the while loop then you're using the photo clip so let's let's add the printerline statement between our Loops to make clear which Loop is looping so let's draw the print line here and let's type here now we so we are looping using the four Loop so now if you run this to make more clear which Loop is looping so now as you can see first the while loop Loops then we have our printerland which says that now our while loop our for Loop starts looping then we loop with the for Loop then at the end we output the total number total number of even only fever numbers found with the while loop we have 10 then we output the total number found the total number of even numbers found using the for Loop and r10 so our code works perfectly well and uh this do not does not represent the the best the best way to solve this challenge of course that you can find a totally different way a better way to solve this so this was my this was just my way of solving the problem so see you in the next video and how I hope that you enjoy this challenge so now it's time to start a discussion about the race but first let's create a new project I'm going to call it a race for the language select kotlin for the build system IntelliJ make sure to have the jdk selected and check this little box at sample code to have the main function Auto generator for us and click on create all right now let's delete the code inside the calibrases of the main function let's hide the project Pane and let's start our discussion about arrays and so far in our videos we've only looked at how we can store only one single value in a variable and that is very useful but what if you have a large amount of values that you want to store in our variables let's say that you want to store 30 or 40 different values in our variable of a certain type of course that you can declare a variable for each of one of those values then and then assign it to the variables but what happens if you have a 1000 or 10 20 000 values in that case uh it will not be practically possible to write each one of those variables and then assign a value to it in a colon help us here because it provides us arrays and an array allows us to store more than one single element in a variable name so it allows us to store more more elements in one single variable name now to declare an array we type Val hero type names next we need to provide the type and the type is going to be an array and IntelliJ is giving us some suggestion there so press enter to fill it in that for you and now we put angle brackets and inside the angle brackets we're going to put what kind of data this array is going to store so it's going to store string or text or sequence of characters then you put equals and here we don't type political value here we have a hero type of function call and here we type array of and now we put our elements inside the the parenthesis of the function called separated by comma so I'm going to put three names here so I'm going to put John Steven and Megan now let's uh let's see what we have here so first we have the Val keyword next we have a name for our variable and the name is names then we have the type and the type is an array which means that you can store multiple values in our variable and next we have angle brackets and string and this means that this area is going to store text or a sequence of characters it's gonna store only strings and then you put equals we have the function called array of and then we put our elements of type string which is those names separated by comma but because cotton has Type inference here you can delete the type and the type is going to be inferred in the same way it was it was inferred previously when I when you just declare a simple variable so now the type is still inferred as an array of strings and now it's a good moment to introduce type hints but we need to activate the typings from settings and to do that you can go to file and click on settings or you can press the the shortcut that you have here for our particular system and for Windows is Ctrl alt s so I'm going to press Ctrl this and here we go to if you have something like this you go to editor click on this greater arrow in front of editor and then you go down here where it says what it says inline hints click on on this Creator are in front of inline hints and from those options select kotlin and here you go to types and select select local variable types then click apply and okay now what you have here on the right of our variable name is a hint so it's not real text this is just there to remind us what kind of type this variable has and in our case is an array of string and my suggestion for this to keep those scenes activated because in this way you'll always see what type of variable is without explicitly declaring the type so this is not uh this is this is just there to help us to remind us what kind of type a variable is now let's say that I want to Output a certain element in the array in the console to do that we cannot just type here println and pass names because you need more to be more specific than that we cannot pass the array here and to get a specific element in the array you need to know that the elements in the array are stored at indexes and the index of an array always starts at zero so the first element is stored at the index 0 and to get the first element we tab we type here square brackets and you put 0 and that if you press Ctrl if you press shift Ctrl p on it it's a string because that is going to return as the first value in the array which is uh John so if you run this code we get John but let's put some text here to make it more clear that this is the first element so let's type first element now let's choose the dollar sign because this now is a placeholder and let's put the curly braces around our our element and the quotation mark here now if you run this code you get first element John let's put here some so get the first element John because uh John is stored at the index 0. and in the same way John is stored at the index 0 Steven is stored at the index one and Megan is stored at the index two so our index starts at zero the index of an array always starts at zero and you can replace a specific in an element in the array also using the index operator so you can type here names again square brackets zero equals so now I'm going to assign a new value to our element stored at index 0 which is now put here the value Alex so now if you run this code now get first elementalics because John was John which is at index 0 was replaced with the value Alex so now we have Alex Steven and Megan but what you can't do is you cannot get an uh element at neither and an index that doesn't exist so we cannot get here let's say an element of the index 4. because if you run this look what happens we get an error which says array index out of bond extension index 4 out of bonds bonds for length 3. that is because the index 4 doesn't exist and here we try to access that value and that value at that value and that index doesn't exist and this is called the runtime error because this error is is called only one while our app is still running so you don't have here an error like we have for uh here we don't have a compile error which you saw in our previous videos that is because the size of an array is not known we tell our compile time also it's very important to know here that the size of an array is fixed so this will always have the size three and uh the only way to add new elements to it is to put the elements directly here but there is not another way to let's say that I want I can put another element in the array down here we can only replace elements and then in the next videos you're gonna see that there are other arrays which are more flexible in the sense that they can grow and Shrink we can add the or remove elements from those arrays but for now uh we're gonna look just at the for this array so let's change this back to zero to don't have that error and um to avoid this kind of Errors you can check to see what is the size of the array in other words to see what is the number of elements stored in Array using the size variable so let's do that so I'm going to add the printer lens statement below for first one so I'm going to type here println and here I'm going to put the text the size of the array is and here I'm going to put the dollar sign curly braces now I'm going to use our names array and you're going to put that size and this is gonna give us the size of the array or or it's going to give us the another words the number of elements which are stored in this particular array so if you run this code you're going to see first output the first element is Alex and then you're going to see the size of the array is 3. so we get first element Alex and the size of the array is three and this is very important to note that the size of the array is always one times greater than the last index in the array so we have an array which starts as index 0 and and ends at index two which has a size of three so very important to remember this to avoid the crashes and your programming and of course that you can put other data types in our array so I can declare another array here also Val called numbers and we can use the array of again and here I can pass some numbers and now you see the type is an array of Fint or an array of integers or whole numbers and you can also mix types here so you can put here numbers and strings so now we have another and this which is between our angle brackets you don't know you don't need to understand this for now but this allows us to have array of two types respectively of type int and of type string and you can post also a chart here if you want let's say a so we can create an array of any type if you want so this allows us to to put to mix our types in in the array and because we've looked at loops and how you can use loops you can use Loops to Loop to this array so I can put here let's say that I want to use the first array so I can put here four name in names now I'm going to refer our array of strings then print print A lender name so now you see that we have this type hint for our name variable that we have here of course this can have whatever name you want now if you run this you're gonna see our three names outputted down here in the console so now we have Alex Stefan Steven and Megan because uh now you're we're using the for Loop to Loop through our array names and uh this is interesting but what if you want to Loop through our array numbers which is a mixed array we have numbers and strings and charts we can refer it here let's call it I in and now you see the type that was inferred for the eye is this comparable that we have here so this is going to Loop through our mixed array so we put here I now if you run this you're gonna see our numbers and in our name one and our chart output down here so now we get first element Alex which is a printerland statement then the next print line statement the size of the red then you have our numbers in our numbers array and then we have our name one and our and then we have our chart so this allows us to to Loop through our mix arrays but what if I want to to Output only if I want to Output in the console only the integers in this mixed are equal numbers to to do that and this is a good good way to introduce this keyword and with this keyword we can check to see if a literal or a variable is supposed certain type so I can put here if I is let's say an INT then and only then I'm gonna output this value in the console then I'm going to call our printerland and I'm gonna post our password I variable to our println function now if you run this you gonna you gonna see in our Loop only the numbers here only the integers because this is keyword is checking to see if our right is of type integer and this is going to return true or false in our case it's going to return true for our for all of our numbers that we have here so we have four five six seven and four again and you can check to see if this is a HR I'm gonna see in the console only our single element a I'll put it down here so we have a or you can check to see if this is a string this element that We're looping at this particular iteration let's say so if you run this you're gonna see in the console only name one because only name one is of type string so I get name one so this is very important to know that with the is keyword you can check to see if a variable or a literally is of a certain type or if it's not and based on that too to just to do some in our case you output that value in the console if that condition is true so this is how you can use the is keyword and the for Loop to to the for Loop to Loop through our array and these keyword to check to see if an element in our arrays of a certain type or if it's not and let's change our array numbers to a different name because numbers is very specific it implies that we only have numbers in this array but we have a mixed type so we have multiple types in uh our array don't have only numbers and to do that instead of changing our numbers array and everywhere in our code where you're using the this variable we can right click on it go to refactor and click on rename or you can click shift F6 now if I change the name of our array numbers it will be change everywhere where you call this variable so look if I delete now the name the name is also changed in our line of Code 9 we're using in the loop so now if I change this to let's call it mixed elements if I press enter now this will be also changed everywhere or we call our our variable respectively on the line 9 here so now we have our our array numbers change to mixed Elements which is more uh descriptive because it implies that we have an array of mixed elements so now it's time to do a challenge using the knowledge that we have about arrays but first of all I'm going to delete the code inside the curry base of the main function because I have the previous project opened now the challenge is to create a function which is going to take as an argument an array of integers then you need to figure out a way to determine which number is the biggest number in that array then we need to return that number to the function and you need to create another function which is going to do the same thing but it's gonna figure out what is the minimum number stored in that array and then it's going to return that value and third you need to find a way to combine those two function in just one function which is gonna return the maximum value stored in that array if you want or if you don't want it to return the minimum value so try to solve this Challenge and then watch my solution now let's solve this challenge so first I'm going to create a function which is going to be called the find marks this function is going to return the maximum value and it's going to take us and I'm going to Define here parameter and an array so here I'm going to type a name for our array is going to be called numbers n is going to have the type array of int of integers and it's going to return an integer now here I'm going to declare a variable it's going to be a VAR and it's going to be called Max and in this Max variable I'm going to store the first value in the which is uh which is past which is in the which is in the array so I'm gonna type here numbers square brackets and I'm going to use the index 0 to get the first value in the array then I'm gonna Loop through this array so for number in numbers then here you're going to check to see if our number is greater than our first value which was stored in the array or max value and if that is true then I'm gonna store this value which is now greater than our than our maximum value in our Max variable so here I'm going to put Max now it's going to be equal to this number which is found to be greater than our previous max value and at the end of this loop we're gonna return the maximum value and we're going to do the same for the finding the minimum value so I'm going to copy this code and this is going to be called find mean but uh here gonna change a little bit the logic let's call this variable mean and you're going to change the condition to less than min [Music] now let's call those function in our main function and let's pass summaries to see how it works so first I'm going to declare a variable it's going to be a Val and it's going to be called Max and now I'm going to call our find Max function and here I'm going to pass an array and I'm gonna I'm gonna pass the array directly here so I'm going to type array off and I'm going to pass some arbitrary numbers like then I'm going to create another valve this is going to be called mean now I'm going to call find Min and here I'm going to also call our array of function and here I'm going to Define some arbitrary numbers again now I'm going to Output those value in the consoles so I'm going to add printerland here I'm going to type max value is dollar sign and I'm going to refer our Max variable defined above another println now let's run this code it's get max value 7 which is correct this is the biggest number then we get the minimum value is 4 and this is also correct so our code Works uh perfectly well now the next thing is to combine those two functions that we have here let's increase this now we need to find a way to combine those function in one single function which is going to also return the maximum and minimum value but only if I want to return to be returned so I can determine if I want the minimum value to be returned by that function or if I want the maximum value to be returned by that function so I need to find a way to combine those two and to do that I'm going to delete our second function I'm gonna delete the code inside the this function and I'm going to change the name of this function to find mean and Max and now here I'm going to define a parameter which is going to be a Boolean uh which is going to have a Boolean type so I'm gonna call it I'm going to call it search Max and it's going to be a Boolean all right now based on that Boolean value if is true if I want to search the maximum value here I'm going to type an if statement so I'm going to put if search marks then I'm gonna add here the code to search for the maximum value the first let's define um a variable here is going to be also VAR let's be called gonna be called Max and uh it's also going to have the first value in the array which is also adding the zero now if our search marks is true then we want our maximum value to be search and return so I'm gonna add here to the code to to do that so I'm going to type here a for Loop which is going to go through our numbers array and here I'm gonna add the the if statement which I'm gonna check to see if our number is greater than our Max then I'm gonna assign our our number Tower Max now I'm gonna go down here and and here I'm going to add the else part so if this uh argument which is passed to our parameter search Max is false so I don't want to search for the maximum value then that means that I want to search for the minimum value so I'm going to put here else now I'm going to add the code to search for the minimum value and for this you need to Define also variable here it's going to be called mean and it's going to have the value of Max I'm going to explain a minute how this works now here we're going to gonna also Loop in our numbers draw numbers array and you're going to check if we essentially we have the same code that we have in our find the mean function so here we're going to search if our number is less than our mean then gonna sign our number to our mean also I need to return this value at the end of our Loop so here we need to return Max and here you need to return mean now let's press Ctrl alt L to format the code now let's delete the those the code that you have here let's delete also this code now here now I'm going to put our fine Min and Max function directly in the printerland statement so I'm gonna type here uh or to put in a variable for so let's put in a variable first so I'm gonna Define a variable he's going to be also a map it's going to be Auto Max and here you're gonna type find Min and Max now here you need to pass an array first so I need to pass we need to call our array off we need to Define some numbers here let's say uh 20 40. 50. now we need to pass an argument to our parameter search maps which is going to be either true or false so first I'm going to pass through here now if we print this value if you output this value in the console let's say that we type here the marks equals to dollar sign I'm going to refer our variable now if you're around the squad we get the maximum value is 100 which is correct now let's duplicate this code that we have here and let's try it for Dominion value let's call it mean and let's add the printerland uh statement down here let's type domain values dollar sign mean now if you run this code and let's pass here to false let's run this code again now get the maximum value is 100 which is correct and the minimum value is 20 and we did this with our find Min and Max function by combining our two previous functions and the our code on the networks okay now it's time to have a discussion about how this code how this code how this solution to my challenge works so now let's see how our logic inside our find Min and Max function works so firstly we declare our function find the minion marks then we declare two parameters which is one is numbers and is of type array of integers so here we're gonna pass only an array of integers and the second parameter is called search marks and it's a Boolean so you can pass here only true or false then we're going to say to the then we say here that this function is going to return a value next on the line 9 we declare a variable which is called Max and we assign using the index operator the first element in the array in our Max so in this case we're sine 20 in our Max variable and then we declare another variable called mean and we assign our marks in our mean but our Max has the value of 20 because we assigned it here so this variable mean is also is also also having the value 20. so both have have the have the value 20 at the start then we check to see if our search marks parameter is true or false and if it's true then I'm gonna execute the If part and if part works in the following way first we Loop using the for Loop through our numbers array then we check at each iteration if our number let's say if 20 is greater than our Max so if 20 is greater than 20 which is going to be false so the code inside the calibration if it's not going to be executed then go for the next iteration so here now we're gonna see it gonna check to see if our number respectively 40 is greater than our Max which is 20. and this is going to be true and because of that the code inside the calibration is going to be executed so now we're going to assign to our marks which is now is 20. our number which is 40. so now our Max variable has a value of 40. and we're going to we're going to do the setting for the next for the 50. so this condition is also going to be true so we're going to assign it to our Max 50 and so on and so on until it reaches 100 which is uh which is going to be also true this condition is going to repeat true and I'm going to be assigning 100 to our Max value of course that if we had another number here let's say two is going to Loop for that number also and this condition is going to be false for that because our number two is not going to be greater than Max and it's going to exit it's going to exit the loop it's going to tell it's terminate and it's gonna return the maximum value which is 100 like we saw in our output in our console and at this point when we return our max value the function is left so it's not executing any line of code besides our return Max is not going to execute the subsequent code which comes below but if our search marks is false it's going to execute the else part so in this case it's gonna search for the minimum value so here we have the same for Loop we search you go through the through all the numbers but here not checking to see if our number is greater then marks you're checking to see if our number is less than our minimum number so you check to see if our let's say uh let's say let's take 20 30 40 is less than our minimum value which is 20. and that is going to be false so this code is not going to be going to be executed inside the calibration of the if and it's gonna loop again and now it's gonna check for the fourth and that's also going to be gonna be um false so and so on so and so on until it reaches 100 which is also going to be false the loop is going to execute and it's going to return 20. of course that if we put here two let's say now the minimum value is going to be 2 because it's going to Loop for another iteration and now one is going to compare C4 number respectively two is less than our mean which our mean previously was 20 that is going to be true and it's going to assign our 2 to our mean so if you run this code now now you're going to see that the minimum value is not 20 but it's but it's two and after that we return this value to the function which is called so now get the minion values 2 which is correct so this is how this uh code works and see you in the next video so now it's time to start a discussion about object orientated programming and particularly in this video we're gonna look at classes and objects but first i'm going to create a new project I'm going to call it op for the language select Catalin and for the build system IntelliJ make sure to have the jdk selected and also I'm gonna check this little box because this ad sample code is going to add the main function and that code for us so I'm going to click on create to create the project now I'm going to delete this code and I'm going to hide the project pane now what is object oriented programming object orientated programming is a way of writing code in a sense in the way you think about the real world so in the real world we have objects which can interact with it with each other and which can do stuff but the objects in the real world have two major characteristics first is the state so another the state of an object in real life is represented let's say that we think about of a car the state is represented by the color of that car by the number of Gears that car has by uh by the brand name of that car so this is the state of a car the next thing that real life objects have is functionality so objects can do stuff so let's take again the example of a car a car can move a car can stop a car can switch gears so objects in real life have this uh though this those two characteristics is those two major character characteristics represented by the state and the functionality and the aim of object orientative programming is to construct objects using code in the way they are they in the way they are in the real life but uh to do that let's say that you want to build an object an actual object in real life what you first need to do the first thing that you need to do you need to create a template or a construction plan for creating that object in which you're gonna Define the generic things that a car has and in programming you will do the same thing but instead of using a piece of paper or uh or a something on on your PC to draw that that template in programming you're going to use a class so the class is used to create the template which then is going to be used to create an actual object an object which is going to have a specific State and a specific functionality so um in a way you can think that the real world serves here as a model for us to write code and in this way in by combining uh the state and the functionality in one entity and have an object and as you can see you can also have like in the real life objects communicating with each other you're gonna see that this is really powerful because you can you can model your code in a more dynamic in a more you know more create creative way so this is what we're gonna do next so first let's say that I want to create an object of type car and to do that we go down here and we need to Define as I said the construction plan the template for building an object and in this case we're going to build the car object so we're going to Define what is called a class and type the keyword class now we need to name our class I'm going to call it car and the name of the of the class should start with the capital letter and if it has multiple words it should be in Pascal case curly braces and press enter now inside the color braces we need to define the state and the functionality as I said for the objects that are going to be built with this template and to do that we need to use variables first for the state or or in the context of object orientated programming and more specifically in the context of classes they are called the classes and objects they are called properties and we Define them like we Define a simple variable we Type R and the next the first thing that that a car has is a name or brand name so we're gonna type name but we cannot keep this variable uninitialized we need to provide the value to it and I'm going to put an empty string for uh for now so it's gonna have the default value an empty string the next thing is the model what kind of model this car is so it's going to be also a string I'm gonna assign an empty string the next property is going to be called the color it's going to be also an empty string and the next property is going to be called doors so this is going to store the number of doors that a specific object which is going to be built with this template is going to have and we're gonna put zero I'm gonna put zero now we need to Define some functionality for this class and for the objects for an implicit for the objects that are going to be built with this class and um I'm gonna add two functions first one is going to be called move it's not going to take any parameters it's gonna just output some text to the console which is going to say that the car is moving so we put quotation marks the card is moving now I'm gonna Define another function call stop also it's not going to take any parameters it's gonna just outpost on this the console it's gonna it's gonna say that the car has stopped now we have the template we defined what our car is gonna have now we need to create an actual or object an actual and specific object using this template and to do that to firstly declare a variable and it's going to be a Val and I'm going to call it car one so so our object is going to be stored in this variable car one then you put equals and we type car and now we have some suggestions and we have our car that we Define below our car class so we press enter then we put parenthesis so now we have created an actual object a real object real in the programming sense and which but now this actual object was also this is called the instantiation because we created an actual instance but we don't need to bother with these names for now so we created an actual object using this template that we have below but the the properties of these specific objects are those properties that we Define here those default properties and to Define some specific profit some specific values to these properties that this car object that created has we need to type car one dot so this is called informally dot notation and now we have some suggestions so we have our properties that we defined for a car and now we type car one dot and we choose the name and now I'm going to assign a value to this name I'm going to be called Tesla so now our car one object that was created has the property name Tesla now we do the same thing for the next property for the model car one dot model press enter and you put we put here s blade so the model next we also type car one Dot now we're gonna assign a value to the property caller it's going to be red next we type also car one and we Define for the property names for the property doors also value so we're gonna put here four so now our object R1 has for its property for for its properties some specific values respectively have for the name Tesla for the model as played for the car for the color red and for the doors 4. so now let's output the property values of this object that we created in the console and to do that we put our println function down here we put quotation marks inside the parenthesis because I'm gonna add some text here so I'm going to type name equals we put dollar sign then input curly braces and inside the calibration type car one dot name and this is going to return the the value of the property name for the car one object that we created respectively is going to return Tesla let's press Ctrl d three times to do the same thing for the next properties and here we put car one dot model so this is gonna return the value of the model property you're gonna put color and here I'm gonna type doors now if you run this code we get name Tesla actually let's change the text here to model to match the property name model color endorse so now if you're on this we get the name Tesla Model is played color red and doors 4 and those are the values of the properties of this object that we created here with our template car next what you can also do because in the class we Define the two function we can call those functions on this object that we created and to do that we also use the dot notation we type car one dot move and this is going to call the move function which is inside the car one object let's also type car one dot stop to call the store function so now if you run this code we get uh the values of our to our properties and then we get the car is moving and the car has stopped so the car one dot move and car one the stop is calling the functions on this object that we created here now let's uh also add inside the functions the name of the card that is moving so he to do that with here dollar sign inside the class and we type name and this is gonna reference this property name that is defined here let's also do the same thing for the stop function let's type name and now what this is gonna do because those functions are in they are they're living inside this object that we created here car one and this object has the name Tesla when those functions are going to be called they they gonna they're gonna say that the car and the name of the car which is in our case for our objectives Tesla is moving and then it's gonna say the car again Tesla has stopped because they are calling this uh specific object that we created which has uh those specific values for its properties all right so now if you run this quad we get as expected the car Tesla is moving and the car Tesla has stopped so the functions are called on this object that we Define here and it's using the property values that we Define for this object but as I said with uh you can create as many objects as you want using the same template and let's do that let's create another object so I'm going to type here Val Car Tool let's put equals we type car and then we put parenthesis and this create is now another object but we need to Define some values to its properties because now the values for the properties are the default values that we Define inside the class respectively the empty string and the zero and to do that we type here car2 dot name so now we are calling the properties for the car 2 object and now we Define some values to the cut to the properties of the car 2 object so they are this here is not overending the value that we have here because this thing that we have here it's a distinct object in memory uh from this object they are this thing distinct objects and they have their own properties with their own values and their own functions and now let's put here Ford let's put the car to that model let's put Mustang let's put car to that color blue and for the doors let's put two car two that doors equals to two and let's output those values in the console so let's output the values of the properties for this second object that we created in the console and to that to do that I'm going to copy this code I'm gonna paste the paste it below here and now I'm just gonna change the the variable to car two to to call to call the properties on the cartoon object so we put here car2 so now we're calling the properties values on our car to object and now if I run this code now we get name Ford Model Mustang color blue endorseful and the first part is from the our SEC for from our first object which is named Tesla Model let's play The Red Doors 4 and the Carter slice movie and the cards has stopped but let's add a space here to make a clear uh to make a clear which to make uh clear that this is the output for the second object to make things more clear and to add the space we put here a printerland statement we put quotation marks and we put a backslash n and this is going to add a space between our println statements so it's going to add a space between those statements and we uh and those so now if you run this code let's increase this we get the name Tesla so this is our first object model let's play it called Red Doors 4 The Carter size moving because we're calling the functions on the first object and the character has stopped and then we get name Ford Model Mustang color blue Doors 2 and we have our space because you put here this backflash and which adds that space for us let's um decrease this and let's also call the functions the move install functions on the second object so I'm going to type here car2 that move and card two dot stop so now if you run this let's right click and just click on run main.kt now get our first object which is with this uh value for the value of the value for its properties and then we get the two functions called on our first object and um we get in our second object which is values for its properties and then we get the card for this moving and the car Ford has stopped because now um we're calling the functions on the this second object and this second object has the value for the properties has has different values for its properties so this is why you get the card for this movie and the car four has stopped again they are different objects they are distinct objects created using the same template the same construction plan and I'm gonna end this video now and see you in the next video so in the last video we saw how we can create a class and then how we can Define some properties and some functionality to that class then we use that class to create two objects and then we defined for those objects for the property of those objects some values but the way we we Define values to the properties of the object is to call the the object and then the property of logic and then we assign a value and this is okay but if you have more than than four properties let's say you have 20 or 100 properties that will be very tedious to write each one of them and then assign a value and a better way is to use what is called a Constructor and as the name implied The Constructor is used to construct the object and the Constructor is called at the time when we create a new object so at the time of line we we type this line of code when you finish to type this line of code The Constructor is called immediately so that is the the time where we need to pass the values to our properties and to do that we go down here where we Define our class we put at the at the end of our end of the name of the class we put parenthesis and here we Define some parameters the way we Define parameters for functions and the first one is going to be called name it's going to be a string the second one is going to be model also string the next one color also string and the last one is going to be doors and this is going to be an integer no we need to assign whatever value values pass to those parameters to the properties of the class here and to do that just delete the empty string here and type name and as I'm typing you see that we have name and it has this p and this P stands for prop for a parameter so you're saying do you mean this parameter that we Define up here and then we press enter to fill that for us then put we type here model color and then doors now if you go up here we have some errors because now the the when you create the object the objects is expecting for its Constructor some values so if you hover over here inside the parenthesis it says no value fast for parameter color Doors Model and name so if you and if you look down here you see that it has this public Constructor so now what we need to do is to pass the value that you passed down here to to the properties by calling the calling them on the object is to pass them directly in the Constructor and then the values the arguments if you want are going to be assigned to the properties so I'm going to put here and you have this hint name Tesla then we put a comma so we have the again the hint which is very helpful so for the model we put a splade and then for the color we put red and for the number of doors four all right so now this is more concise and now this is doing the exact thing that we did previously but this is more concise and we're using the Constructor to pass the those values to the parameters that we Define here and then those parameters going to be assigned to the properties respectively with those properties name model core and doors you're gonna see what is the difference between the properties and parameters in uh in the next video now we have also an error here because this also express some values to its Constructor so instead of putting those values here we put up here Ford Mustang blue and two now we can delete this because we already passed the values for this second object for its properties now if you look at the codes the code is more concise and more and easier to read now if you run this code you will have the same output because the code works well so now if you look at the console let's increase this a little bit let's scroll up you have the name Tesla Model let's Place color red doors4 the cartridge lights moving the cut Isla has stopped so you have the same output as previously and down for the second object we have we have a the name Ford the model Mustang the color blue Doors 2 and the Carphone is moving in a car 4 has stopped so our code works well now let's close the console but if you go down here you'll see that you have this um this uh the properties colored so if you hover over them it says the property is excretely assigned to parameter name so it can be declared directly in Constructor now what is saying here in other words is that we can put the properties directly in the Constructor so you don't need to define the properties down here and then assign the value that is passed to the parameter to the property and the difference between the properties and parameters parameters is that the properties respectively those that we Define in the in the header of the class inside the parentheses 0 in the Constructor is that the properties are not uh storing the state of of the class they are mastering the state of the object there they are only here to to get whatever value we pass here so whatever value you pass here and his job is to only get that value and assign it to the property name so only the the variables which are declared declared inside the class are storing ultimately the the state of that object so uh if I delete let's say if I delete this here now we have an error here because the property name um it says on our result reference name create member property card.name and that is because the property name is not declared it's not exit it's not it's not a it's not uh it's not a characteristic of a car we didn't Define a property name because here the parameters the parameter name is only there to get the value and then pass the value to the property but we can let's press Ctrl Z to put the code back now the error disappeared because we have the property declared but because the only thing that we do here is to to to get the value that is passed to the property as an argument here and for the next ones and then assign it to the property we can put those directly in the Constructor so to do that we just we can hover over here and let's hover over and click on this light bulb and click move to Constructor so now you have this you have the same the same thing the same thing but the only difference is that we have this VAR keyword in front and that is responsible for changing the changing the parameter into a property so let's do the same thing for the next ones move to Constructor and now we don't have that error that we don't have a property for our class because never because they have the VAR so if you put the VAR or the VAR keyword before declaring the the the parameter it is going to be converted into a property so now those are properties of our class car so they are storing actually they are storing the the value that you pass to to them for the project that we create so uh it's not like previously where you have the property the parameter and then the value is passed to the property inside the class so now if you run this code foreign we have the exact same output the only difference now this that this is uh more concise we have the properties declared the right directly in the Constructor so we don't have declare the parameters and then we assign the value that is passed to those parameters to properties so you can declare the The Constructor like this if you want so the question may arise when to use properties and when to use parameters and to to to answer that question um you have you need to have in mind that if you want to do some if you want to do some work before you assign the value to the property because in our case uh the value that is passed here to the to the property in this case is directly stored in the property so we cannot add some validation to check to see if uh I don't know if this name is if it starts to a specific letter or if it's if it's an uppercase or because the value that is passed that is passed as an argument to the property there I say property because they are there there are no declared as properties it is directly stored as uh as a the state of the object so if you want to to do some work before you assign the value of the property you need to declare it let's say let's say that you want to Let's actually delete this and I'm going to declare it as a parameter so let's say that you want to to to trim the space that is passed so let's say that I put some spaces here let's actually press Ctrl G to see what is happening if I don't do that all right I press Ctrl Z too many times so let's let's again Paul let's put some spaces here so now if you run this code let's run it again [Music] now because the value that is passed as an argument here to the object car one is passed directly to the property so it's stored in the property and we we don't do nothing with it we have also the space but if you want to to delete that space currently we can do that because the values pass directly to the property and there is nothing that we can do from that point and to to change that we can declare the the property that is defined here the property name as a parameter first and we can declare it down here we can declare down here now the property and we can put equals and now we we pass the the parameter to the property so it's a sign name here but before before that value is assigned to the property name we put that stream and that is going to remove the spaces so that Rim is a function which is part of the string class because the the data the all the data size that we looked at are also classes so you can call functions on them the way we called functions so not our on our objects so name that trim removes the space so in this case it removes the space that we have here and after that it's assigning the value to the name property so now if you run this code now now we have the space but if you run the code so let's go up run the code now as you can see the space is removed because we pass the value to the parameter now name then the parameter name trims.space and after that it's assign the value to the property name so in this case so in this can be a scenario where you can uh where you can declare the instead of declaring directly here the property can declare as a parameter but what do what what you can do if you want to add more code than just one line of code in that case we'll need to use what is called the initializer blocks but um we're going to look at the initializer blocks and uh other things in the next video because this video is long enough so see you in the next video so in the last video we looked at Constructors and how you can use Constructors to construct your objects and it was an alternative to defining the values to the properties of the for particular object and we've also looked at how we can Define the this Source I should say it's also called the primary Constructor that we have here the parenthesis and then the parameters or the properties and we've also talked about how we can Define parameters or Constructor and then how we can convert those parameters directly into properties and I've also talked a little bit about how and when to use parameters and properties but in this video we'll continue our discussion about parameters and properties and specifically going to look at how we can execute more than one line of code when the object is created because now when the object is created and we in the last video we trimmed this space that we have here you can execute only this line of course so if you want to add more line of course here to do some um to do a more complex validation we can't because here we can put just one line of code and to add more than one line of code of code they need to use what is called initializer blocks and the initializer blocks are as you'll see some blocks where we can put our code and you can put more than online so forth you can put as many lines of code you want and that code is going to be executed when an object is created on an instance of our car of our of your class is going to be created so um this is what we're gonna do in this video also I should say that you can declare the class in another file not just in this file like we did here so we can open now the project pane you can go to SRC go domain go to kotlin and here on kotlin you can right click select kotlin class file and from here make sure to select file and I'm going to call this file classes because you're going to put our classes respect we're going to put our card class but you can put more classes there and uh we're just going to copy this class that we defined here Ctrl C and paste it here now I have an error because this is declared two times here and here and we just delete it from here and now the arrow disappears and if you run this code we get the same output because our code works perfectly well now the only difference is that now we will put we put our class in a different file and my suggestion is for you is to put the class if you want in a different fly file because in this way you have the code in when I'm going to organize the way because here you have your class here we have the code the objects that we created with that class and so on no for this video I'm gonna use I'm gonna create a different class and to do to do that I'm gonna declare another class but I'm going to declare it down here and I'm going to delete the code that we have here because we're going to use a different class and the class is going to be called user so it's gonna represent the the use and end user object so we type here class user now we create the Constructor the primary Constructor we put parenthesis we Define the parameters or the properties for uh now I'm going to Define directly the properties here so we type here keyword to have the property declared VAR name string so it's going to be we're going to be store stacks VAR last name also string and uh VAR age this is going to be an integer so this with this class we're going to create some user objects I'm going to put curly braces and for now we're not gonna put any code here so let's create a user so let's type here Val or let's call it user you can give it whatever you want so let's create a new object now so we put you type your user and then for the parenthesis because I'm going to put we're going to pass the values to the Constructor here Sony to pass a name I'm gonna type Alex last name no binka and for the age 23 so now we created a new instance a new object using the using the cluster to Define below but what if I want to to pass to to the to the name to the name name property only the the names which starts with the letter A in that case we need to declare this property as a parameter first we need to declare here the parameter and then to declare the property below and before before we assign the value that is passed to to the property we need to do some validation and if that argument that is passed to the parameter is starting with the ale letter then you're going to assign the value to the property name otherwise we don't do that so to do that we need to use initializer blocks because we're gonna type more than one line of code and the initializer blocks are used in conjunction with the primary Constructor so when we create a new object like we did here the initializer blocks or the initializer block is going to be called immediately when the object is created and to use an initial initializer block we just but first let's declare let's change this to to a parameter so let's delete the VAR keyword in front of the variable so now we have only a parameter here now let's declare the property down here and now here we need to Define an explicit type declaration so we need to put here the type string because as I said um we're not going to assign the value to the property directly here in one line of code we're going to assign the value to the property inside the initializer blocked after we do the validation respectively after we check to see if the name that is passed to the objects that we're going to create with the class starts with the letter a and if the the name if the argument doesn't start with the letter A then we're going to assign an empty string and we're gonna output something to the console so this is why we need to provide here the type because I'm not gonna assign the value directly here so it cannot infer what kind of data is going to store then you press enter we type init and here we have a suggestion we have the unique keyword and then we have the curly braces press enter and now here we're gonna add our validation and here we type if parenthesis now type name so now we're referring the name parameter defined above here so if name or the value that is passed to the name parameter first we're gonna um lowercase dot name and to do that we type here name dot lowercase because I want to have both cases so if if the user passes let's say a name of the lowercase letter then we're gonna check to see if it starts with OTA but if the user passes the the name of the an uppercase later we also want to check to see if if that letter starts with a and to cover both cases we lowercase the input we lowercase the name so all the lowercase all the letters then we put here another Dot starts with an input here a and if that is true then we're gonna assign whatever value was passed to the name parameter to the name property and we cannot type here name equals name because now it's referring the parameter here and to refer the property that we Define here we need to use what is called the disk keyword so the disk keyword is used to refer them properties of the class so it are here this so we're saying this name so now we have this name and we have a different we have this V variable here then put equals name so now we assign the value that is passed to parameter only if that valuable only if that value pass to the parameter starts with the letter A then we're gonna assign the name to the property name else if that is not true put curly braces and now we need to cover the else part because if this is not true we also need to pass a value to to the name proper the name property cannot stay without a value so we need to pass those over here else we're going to put this dot name and I'm going to put user so I'm going to put the user text if the if the the name doesn't start with the with the letter A and we can also output some text.com so we put println here and we'll type the name doesn't start with the letter a or capital a so now if you create a new object here so we type here Val let's say for friend we create a new object so we type user now we need to pass the values to the Constructor so you put here a let's say uh John let's put Smith let's put 30. now because the the value that you pass here to the parameter name doesn't start with a letter a and start the letter j this value validation inside the initializer block is going to be false and then it's gonna it's gonna execute the else part and it's going to assign to the property name the user text and it's going to Output the name doesn't start with the letter A or a but if that is not uh if but if it's true if it starts with the letter A then this line of code is going to basically the base part n is going to be a sign it's going to assign the value to the property so now if you run the squad we get the name doesn't start with the letter A or a and it's correct our name starts with the letter j so if I put here let's say Andhra let's change this to oh let's see here also Smith now if I run this now we have no output because the this the initializer block is is called and the If part is evalu is to true and it's assigning the the name Andra to our name property so let's add the print and then down here to see that that is correct so print let's print the value of of the property name for our friend object and we put here and here we type dollar sign you put curly braces and you type friend Dot name so now if you run this let's close get name under let's put comma here let's put colon here so our initializer blocked is called the code inside the initializer block this execute it and then this if check average to true and then and then it assigns the name Andra to our property name but if we I put here John let's type it like this let's say to see that it's working because we lowercase the letters okay the name doesn't start with the letter A or a name user so the initializer block is executed immediately when the object is created and the code incidential log is called it checks to see if it starts at the lower it starts with the with the letter A and if not then it is assigned to the property name user so we have this we have user here and then it outputs uh this text to the console so this is how we can use the initializer blocks in conjunction with the primary Constructor and you can also put more initializer blocks and the order in which you put the initializer blocks matters in the sense that the word in which you define the initializer blocked is is going to be the word in which they are executed so the word in which you define them it's important but most of the time I think you'll you use only one initializer block to put your code so this is our discussion about initializer blocks and in the next video we're going to look at um because we talked about the primary Constructors there is a another type of Constructor which is called the secondary Constructor of this secondary Constructors and we can also look at the default parameters because you can put you can we can Define default values to the properties also the parameters of the Constructor so we're gonna do that we're going to do that in the next video I'm gonna end this video a little now so now it's time to start a discussion about secondary Constructors because besides our primary Constructor that we Define and that we talked about in Cotton you can Define multiple Constructors and those are called the secondary Constructors now you may be wondering why you will need secondary Constructors and to answer that question we need to consider the user class and those user objects that you can create so let's say that an user only provides its first name and for the property is last name and the age doesn't provide any value in that case you will need the you need a way to to Define some default values for those properties in case the user only provides the first name and uh if let's say the next user does provide the the first name and the last name and the age in that case you're gonna use uh the the primary Constructor but if it doesn't provide those uh those values then you're gonna use the secondary Constructor but to make this more clear lists uh let's add the code and we talk we talk about was while I am writing the code so let's delete the initializer blocks that we have here because you don't need this code and let's also put the property now let's define the property in the primary Constructor so let's just put here a VAR the work here in front of the variable let's also delete this printalian and um let's delete the values here for the last name and the age so now as you can see we have an error because it's expecting here the um it's expecting an argument a value for the last name and for the age and to solve that problem we just go down here and we type Constructor so this is the keyword for declaring the secondary Constructor and we press enter to fill in that for us and we put parentheses and now here in the parenthesis we Define the parameters and I am specifically saying parameters because as you will see the secondary Constructors cannot declare properties they can only declare parameters because anyway Let's uh so let's define here the parameter so I'm gonna type here name let's put here the type of this variable is going to be a string now if you hover over here it says primary Constructor called aspect insert this call so what all the secondary Constructors need to do is they need to call the primary Constructor because ultimately the primary Constructor is the one which declares the property the properties for the class and stores the values for uh of that Pro of that property and to do that to put here colon we type this so we put colon this type that this keyword then you put parenthesis and to the disc call we pass the name so this name that we defined here and for the next two values we're going to pass some default values so here I'm going to put user because let's say that because as I said in the beginning this user is gonna not it's not gonna provide the last name so let's put your last name not user last name and for the age let's put let's put let's say zero all right now what this is going to do is now if you look up here don't have an error so let's uh so now we don't have that error because now it's using the secondary Constructor is passing the value here Alex to the secondary Constructor that we Define here and here we Define only the parameter and the value that is passed as parameter then is passed to this to the primary Constructor because by putting colon and these and parenthesis we're calling now the primary Constructor and is the primary Constructor the one which ultimately declares the property and stores whatever value we send to him in this case we send the value Alex and for the last name we uh we just send the last the text last name and for the age you put 0 because this is our way to saying that this user doesn't want to provide its age so this is why you need to call the the primary Constructor from the secondary Constructor because again the secondary the primary Constructor is the one which ultimately declares the properties of the classes the one which stores the the the properties of the class the secondary Constructor only only takes parameters and then calls the primary Constructor so in fact if you put here the VAR keyword you have an arrow which says Varon secondary Constructor parameter is not allowed that is because the secondary Constructor cannot call it cannot declare properties only the primary Constructor and because as I said you can declare multiple second Constructors we can type here Constructor so we can declare another secondary Constructor and here you can put name here we put string then we type last name also string so this secondary Constructor is only going to take the name and the last name as arguments the age is not gonna this uh is gonna not gonna take any value for the age now we need to put colon we type this parenthesis because now we're calling the primary Constructor and here we we pass the name that is passed to this secondary Constructor this that we Define here the last name and for the age we're going to put 0 because this uh this second secondary Constructor doesn't take any value any arguments for its uh for its age but because as I said ultimately the primary Constructor is the one which defines the properties we cannot we cannot call the prime Constructor and not pass any value so we pass this default value here and uh so now if you go up here and let's say that I delete the age now our code works fine because now what is happening here is this the the value for the for the name and the last name is passed to this secondary Constructor this one here and the secondary Constructor then calls this primary Constructor and it's passing the two values to the Primal structure name respectively this name John and last name Smith and for the age it passes the default volume zero so this is how you can this is why we can pass here uh this this is why you can avoid here to pass let's say uh you can avoid to pass the last name and the age for the first because it is using the first secondary Constructor and this object that we created here it's using this secondary Constructor because here we're passing only the first name for the value for the first name property and the value for the last name property so it's passing them to this secondary Constructor which then in turn calls the primary Constructor it passes them to the primary Constructor so it passes the the values for the two properties and the last one is defaulted because okay because you don't provide the value for the age with Pro with secondary Constructors you can also put you can at the end of the call of the primary consultor you can put curly braces to have some code executed when you create an object with that specific uh secondary Constructor so you can put here curly braces and inside the color blades you can have some code which is going to be executed you want to create an object with this let's say secondary Constructor an object with this secondary Constructor so it's up to you what the code you put there but to illustrate this let's put a println statement here in the in this secondary Constructor so let's type here println and here I'm going to type second and I'm going to type second because uh this is the first Constructor this is the primary Constructor and this is the one which ultimately does all the work is the one which stores the value for uh the properties and this is the third Constructor so let's copy this let's put here to Third just for illustration Also let's output in the console the value of the the property values for these objects so let's type here printerland and just type here name equals let's put dollar sign let's put curly braces let's use our user variable now let's call the properties on this public so let's type name now let's press Ctrl d two times and let's put here now last name and the age and let's also other space between the information about the two objects to make things more clear so let's put the printer and heroes and put a backslash in here and let's copy the code that we have here let's paste it below let's change this object to our friend object that we created just like your friend and I'm gonna speed this now a little bit because it will take some now let's output this information in the console so now what we have is we have we have second and then third because this first object is using the the second Constructor so this is why we have here a second and then the next line of code is called and we have third because this one this object that you have here the front object it's using the third Constructor this secondary Constructor so this I have here third then we have the values for the properties for the I didn't have the values for the properties of the user object so you have here the output down here and then we scroll down and have name John last name Smith age zero because we have a the property values for the second object for this object and this is okay this works completely fine the thing to have in mind is that now we're using the secondary Constructors and the secondary Constructor then calls the primary Constructor and the primary Constructor is the one which ultimately stores the value source which ultimately declares the properties and stored the values but one thing to notice in the output is that the first object has the name Alex and the last name last name and age zero that is because the first object is only taking a value for the first name property or for the name property and for the last name and the age because it's using this secondary Constructor is only passing in the first name which is Alex that we have here and then it's using the default values last name and a zero it's passing those default default values to the primary Constructor so it's calling the primary Constructor is passing the value Alex and then the default value last name and zero this is why I have last name and 0 here and for the next one we have name John and last name Smith this is because now this is using um the next secondary Constructor and that takes as arguments the name and the last name and then it's calling the primary Constructor it passes the first name and the last name and the aegi is defaulty so you have zero so this way you have here John and Smith and then zero so it's important to to notice this and to think about how this uh to think about this thing so this is our discussion about multiple Constructors respectively about secondary Constructors in this video you saw how you can pass a different number of values to our properties ultimately you pass all the values to the properties by calling the primary Constructor and providing default values because in this way you can satisfy all the possible cases so if in our case one user only provides the name and the last name is not provided and the age is going to use the this secondary Constructor and it's going to pass the last name as default and the zero and this is uh in a way similar to overloading functions but is not the same because what you're doing here is overloading the constructors and this in this way you can you can think about why why we're overloading the constructors and that is because if we didn't have secondary Constructors we would have to create another class with a different number of parameters or the different number of properties and we will need to to create each object with that specific class let's say that we create this object which only takes a value for its parameter name then we have to create a class which we're going to Define only the name property and it's gonna then we're gonna create that obviously with that class and if an object if an object let's say if an user creates uh if your user doesn't providing the the name and the last name but now the age you have to create another class with only the name and the last name defined as its properties and you can see that this this uh is uh this will generate uh duplicated code and so on and we can solve all of this by using secondary Constructors and calling the primary Constructor so see you on the next video and because quoting is about conciseness in the next video we're going to look at how we can do the same thing that we have here with default parameters because um kotlin supports for its properties for its parameters in the constructed default values so the same thing that we have here can be achieved by providing default values to the properties so see in the next video so now it's time to look at default values for our properties and first let's delete the secondary Constructors and now I have a error series because it expects the value expecting the values for the next properties here and um let's also change this to to first name because I refer to it to the first name but it was called This is it is called name so let's call it first name so go right click on it go to rename and then to refactor to change it in all the places and let's call it first name and as you can see now let's change it in all the place then press enter so now we have the first name and the default properties are default values to our properties are basically they are similar to default values that we provide to our parameters when we talked about functions then what we do is uh let's say that I wanted to provide the default value for the last name we just put equals so inside the primary Constructor we put equals and here we put let's say last name so now this has the last name as a default value if a value is not provided for the last name and here you can put also equals n equals zero and now the error as you can see disappeared from both of our objects because now what is doing is when we don't provide the value for the last name and for the age then the default values that we provide here is going to be are going to be used as the values for the properties so this is a way of achieving the same thing that we achieved previously with the secondary Constructor but this is more concise and the question is when to use one on one or the other is the um the answer may be if you want to execute some code when an object is created let's say with one of the let's say if you wanted to if you want to exit some code when you create an object then you can use secondary Constructor because as I said secondary Constructors can have a block of code when uh which can be executed but the this uh the default because primary Constructor does not don't don't have a don't have a block of code they you cannot do that maybe you could use a initializer blocks but that is uh open to discussion so this is how you can provide the four values to to the primary Constructor in our code was fine it's In This Very concise very beautiful and the next thing that you can do is that you can also use named arguments so you can use the because here you use the first name and the last name and if I um because those are those are both strings here you cannot see the distinction but if I put here uh now I can use the name argument so I can put your first name equals so it's similar to the way we have name arguments in our function and here you can put the text John also here and this uh with this thing you can you can change the order in which you need to define the values for the parameter so let's put your last name but we'll say this better let's create another object is user 2 let's type user and let's put here you wanna but let's use the name arrowman so let's put first the age so we're going to provide the value for the age let's say um 19. and um Let's uh let's type first name so here let's put um IWANNA because it's a string quotation marks and for the last name let's say let's type also the name argument last name and for the last name let's put here um Dobby let's say right so what we did here is that in the primary Constructor the order for for the properties very specific we have the first name and the last name and then we have the age but with the name arguments we first provided the age so we provided a value for the age product which is the last one so and then you provide the value for the first name and with the name arguments similar to the way used in our functions you can pass the values to the properties in which order you want irrespective of the word in which they defined here so this is very powerful if you if you ask me it's very interesting because you can pass the values to the properties irrespective of the world in which they are defined so this is our discussion about default parameters and the name argument in with the primary Constructor and you cannot use default parameters name arguments with the secondary Constructors they can only be used the primary Constructor so see you in the next video but uh before I end the video Let's actually run this code to see that it works in the same way it was working in previously when we use the secondary Constructors so let's run this code so you have name Alex last name last name because it's using this default value that defined here then we have h0 because it's using this value of defined here so this is this object and then we have name John last name Smith a0 because now it's using this default value so the same thing can be achieved using um default parameters and we didn't output the values for the for the second for the third object that you created here in user 2 but you can do that as a as a challenge for if you want you can output the values for this object so see you in the next video so now it's time to start a discussion about Getters and Setters because so far enough videos even though we didn't see explicitly the Getters and Setters here we've used the Getters and Setters every time we got the value of a property and every time we assign a new value to a property and um the getter and Setter in kotlin are implicit so they they are declared they are Auto auto generated by default by color by cutling for you so every time you and let's say you get the value of an object let's say let's get the value of the user that's first name what actually happens here is not that we're getting the value of the first name directly even though if you look at the code this what it seems to be what has happened is that every time we get the value of of a property that value is returned by the getter so you never access the property directly and you never never does change the the property of uh the value of a property directly you every you every time you you are using the Getters and setters and now this discussion is touching on on a very important Concept in quadrant programming and that is encapsulation so encapsulation basically means to to protect to hide the inner workings of the class from being accessed outside and if you look at this syntax that we have here it seems that we actually accessing the values the properties directly but as I said that is not the case because we're always using the getter and the setter and because we always use use the Getters and the Setters the getter to get the value and the set to to change the value of property that means that your data your properties are never accessed directly thus the laws of encapsulation are not broken the the in other words you you never allow somebody outside of the class to access directly that property so this is why uh this is why we have Getters and Setters and this is why the Getters and Setters in Kathleen are implicit so they are not even declared explicitly here we don't see any code which it will imply that we have a get a Setter here because they are automatically and by default generated every time you define a property so every time you define a property either in the primary Constructor or inside the class the Getters and the get the getter and Setters automatically generated for you but uh let's say that you want to override the getter and Setter to provide some additional additional code to the code that is by the by default provided you can do that by changing let's say this property to a parameter and to override the getter in Setter and to see how the Getters and Setters actually look under the covers just type here VAR we Define the property first name we assign the first name parameter property now the Getters and Setter need to need to be overrated immediately after the with after we Define the property so we cannot have some code here and then to override you can to override the getter and Setter so we need to we need we need to Define them immediately after we we Define the property so we type here get and as an attempting you see that I have some suggestions then you go down here you and you can choose you choose this one so you have parentheses curl braces and inside the curly braces you press enter here you type return field I'm going to explain immediately what is this and now we need to override the setter and to do that to just type set and I have some suggestions we also go down here we choose this one press enter and hero type field again this under this identifier and input equals to value so this is the implicit code that is generated that is auto-generated by kotlin for you every time you you you define a property in your class either in the as I said in the primary sector or inside the class so because in fact if you look here we have some underlines and if you hover over here it says redundant getter remove redundant getter because uh and also for the set it under setup because they are redundant because they are implicitly again Auto generated by cotton for you so this quad is redundant here you don't need this code because Scotland already provides this code under the covers for you but if you're not such satisfied with this quad with this implicit code that is uh Auto generated by cotton can you can um you can override them like we did here and provide some additional code so we can put here let's say some text so so that every time we get the value of our we get the value of our first name property you're gonna have a pretty pretty prefix and let's put here a first name let's put the colon dollar sign and field we're gonna play I'm gonna explain immediately what this field is but let's say first however how this works and here let's put a printerland to print a value that is passed to the setter and then assigned to the first name property so let's put here dollar sign value was assigned to First foreign now I have name so we have our text that we have here name and then have first name Alex let's actually delete this text to make things more clear let's delete this text let's delete this now let's run this code again so what we have now is that every time we get the value of our property name we have we have that prefix first name that we have uh overwritten here in the in the getter so the getter is called as I said the value is returned by the getter so together is called it Returns the value of the first name property so this field is is the first name property but is uh it has this identifier field because of uh of an important reason which I'm gonna explain immediately so it Returns the value of the first name property with the prefix first name and we have first name the text that we have here then I have the value of the first name property we have Alex in our case because our object has the name Alex as the property name Alex then for the for the setter we don't have any code here also we have the first name prefix for John so our our every time we get uh we get the first name property by of our objects created by by using the user class it gets that value it returns that value through the getter and the setter we don't have value was assigned to first name property because the setter is called only one we change the value of uh of uh of our properties and to do that we type user like we did in our first video about objects or another programming DOT first name equals let's say oh let's put here Vlad so now if I run this code now the setter is going to be called because the setter is called as I said only when it we change the value of our of our of of our property so we get uh get Vlad was assigned to first name property so the code inside the setter was called because this code that we type here is calling the setter so our code only only always goes to the setter and the code that we have here user that first name Vlad what it's actually doing is passing that value Vlad to here so this for this uh this parameter it that we have here is receiving the value of Vlad and then that value is assigned to first name property again we have this field the identifier for a reason and the reason is going to be explained immediately so uh the Getters and Setters are working well and they are as they said again the use always when we get or assign a new value to our properties now what is this field identifier why I didn't type here uh first name and here I didn't put uh first name equals to Value so whatever value is passed to the setter then that value is assigned to the first name property so why why don't we don't do that and um the reason uh for that is that because this syntax user.first name user first name user.first name equals Vlad is calling the setter if we put here first name equals value so first name equals Alex it will be equivalent to to call the setter again so this line of code that we have here it will call the setter again it will pass the value to the center and then it will assign the value again to the first name so it will call the Center inside the setter forever it will be it will generate an error and to avoid the that recursive call that infinite call we need to use this field identifier so the field in an identifier is the first name property but it has this special use that it bypasses that error that it will be generated if you use the first name here so in fact let's um let's put here a first name to see so if we put here first name instead of field and we have an error here let's put here a field because I want uh I want the error from the setter to to get in the console not there or from this thing here so now if you run the squad as I said that will generate a recursive call it will call the getter over and over so get the error so you see we have Vlad was assigned to first name property Vlad was assigned to first name property vad and so on that is because the setter it's calling the setter forever it's a recourse of call because this line of code here it's calling the setter it's it's a assigning the value to the sending the value to the seta then it's that values assigned again to the first name property which in turn close again the setter and so on so this field the identifier is used because it has this characteristic of bypassing that error this is why we're using the field instead of the first name property here and it's basically the first name property but it has this specific characteristics which characteristics which bypasses the recursive call which we got when we've used the first name property now if you run the code now I have no error because the recourse of call is not happening because you're using the field which bypasses that error so this is why we're using uh and we're having an encodone has this thing filled and this the field can only be used inside the getter or the setter not uh not anywhere else also either getter or the setter and the same is true about the getter this is why you need to use the field identifier inside the getter also because it will generate the recursive call again now to to illustrate better because you maybe find the confusing this discussion about Getters and Setters what they really are they are equivalent to having two functions which update the first name property and return the first name property so they they are equivalent to having a function called Set uh first name and this function defines a parameter called let's call it new value is going to be of type string let's put curly braces and here we type this DOT first name equals new value and the geta equivalent to having a function called get first name and this is not going to take any parameter is going is we're going to say say explicit here that it's going to return a string because it's gonna only return a value and this is going to return the first name property so we put here this that first name so the getter and Setter that we have here are similar this is uh illustrative for you to have in mind to having two functions which are setting the first name property or updating the first name property and are returning let's change this to First and are returning the first uh the value of the first name property but because constantly and it's about conciseness it has this special syntax and they are automatically generated for you because uh as I said accordingly it's about conciseness so you don't need to declare those things every time you create a class so let's delete this so have in mind that under the covers is we have something like this so let's delete this now the arrow disappears also you can have a shorter way of writing the centering letter if you don't provide some additional code so if I delete this and this I can put here get equals field and um yes this is this okay because this is like having a single line a single function a single line expression function because we're returning the value to the function get so you can write it like this because or I I show you this photo because maybe you'll see a written in this way and you may be wondering why that's because this is like having a a single body expression function so you can write it like this if you want but again if you hover over this is still already done let's so let's press Ctrl G to have the previous code so this is our discussion about Getters and Setters and see you on the next video so now it's time to start a discussion about the late init keyword and how we can use the latent keyword with the our properties but first let's delete the code that we have from the previous video because don't need this code let's also delete this code let's delete those two objects that's and lazil is property let's declare it here so let's put the VAR keyword and let's also delete the default values here and let's press Ctrl alt form on the code now we need to provide the values here because we don't have default values for the last name property and the age so I'm going to type here dobbyn let's say age 23. now as you already know if you declare inside the class a property let's say that that property is called favorite movie and it's going to store the favorite movie of the user you cannot let this variable uninitialize so let's say that is going to be of type string so you cannot let this variable uninitialize you need to provide a value either by assigning directly a literal value here or by receiving the value through through a parameter defined in the Constructor but um that is not completely true because sometimes you'll want to to have a property declared inside the class but you don't have to assign a Twitter valued uh right away so you want to assign the value to the property later and to be able to do that you need to use the late init keyword and to use the late neat keyword you just type here late it and you have a suggestion later need and later need search for initialize letter later so what we're saying here is initialize let later this property favorite movies so you say in the to the compiler hey I'm gonna initialize this uh property favorite movie but I'm gonna initialize it later so believe me and uh to do that you just type user that so you whatever object you create with this class and you have a defined latent property favorite movie and you put equals and then you put let's say Interstellar here so now we've initialized our favorite movie property but we initialize the its value later so we didn't provide the value here directly inside the class either by as I said by providing a literal value or by providing a value through the parameter defined in the primary Constructor so this is how you can use the latent keyword if you want to assign a value to a property later so you don't want to assign the value directly or or you don't want to cite the the value more correctly said right away so you want to assign the value later you just put the latest keyword in front of the property and then you declare the property as you the way you declare a simple variable right and if you don't initialize this this property and you want a new output the value in the console so let's say that I put here a printerland and I type user that favorite movie and I don't initialize it and if I run this code now this favorite movie property is not initialized doesn't have a value we're gonna have an error and the error is uh it's very specific so you have exception thread main kotlin unofficialized projects access exception we have and then it says later need property favorite movie has not been initialized so it's very specific in saying that hey you didn't you said that you're going to initialize that property but you didn't and uh down here you try to to Output in the console the value of the favorite movie but we don't have provided a value and it's better to have this uh this is called an exception so it's better to have this energy Pro and initialize property access exception then having a null pointer pointer exception because this is why kotlin actually enforces this behavior of uh assigning values to the variable to the variables so it Cotillion forces to assign values to the variables and not let them uninitialize because if you don't initialize uh you don't provide the value to a bear to a variable or two property then when you try to access that variable or that property and let's say that you have an app that is gonna throw which is going to throw what is called the null pointer exception and that is very bad because those kind of excursions are called only at runtime and not at compile time so your app can work let's say completely well and when you press a button I don't know to to see the the favorite movie of a user then you get an error and adopt crashes so this is why you need to avoid those null pointer exceptions and kotlin as I said enforces this behavior of providing um values always to the variables to the end to the properties and if you don't want to provide the value to the property then you can use this late on it and it will show this uh different uh exception called latent property favorite movie has not finished so it's it's a different exception than the null pointer exception but with the latent keyword we can still have as I said that behavior of not initializing the variable but you still need to initialize it later because this one is called late init but this is not uh saying that the latent error that is shown here is not also uh having the same behavior like the null pointer exception that I talked about because the late init error that is that we have here if you have an app it will uh also Crusher up but the later neat keyword allows us to not provide as I said the value literally a little value here or a value through the constructed by the by assigning the parameter here with the value pass of the parameter and the is uh is our responsibility to initialize that variable later so that you don't get into the same problems that we talked about so we don't get this error so it's up to you to to declare a a property as late and eaten then provide a value later because if you don't it will also Crush you up when you try to access uh by uh I don't know in Europe somehow you want to access the value of that property so I always have a have a decent mind that you need to initialize that variable later also I should say that the latent keyword only works with classes and it does not work with primitive type so even though the as I said the integers and all the data types that we looked at and also the Boolean and Char are classes we cannot use latent adhered with them because if I put here in you can see that I have an error that it says latony modifiers not allowed on properties of primitive types because uh I'm not gonna get into much of details but all we need to know to know is that when the int class and all the Primitive types which are classes uh at least at the surface when they are compiled I think they are compiled into primitive types so they are not compiled into classes so this I think is the reason that you don't you can't use this latent in the keyword but for other classes because a string is is a data type but it's a special data type as I said you know in a previous previous video and because of that you can use the latent keyword and you can use the latent latent keyword with other classes so I can put here user if you want and it works because users is also class is this class that we Define here so it's good to to to remember this now I'm going to end the video and see you in the next video but first let's uh press Ctrl G to have the code that you had previously so uh now I'm gonna end in the video and see you in the next video so now it's time to start a discussion about companion object but to do that I'm gonna delete the class that we have here and I'm going to paste it inside our classes file because we're gonna need this class later in our videos and I'm gonna also delete this code because you don't need this code and let's say that let's create the class called calculator is not going to Define any properties you know it's going to have a simple function called sum which is going to sum two numbers so we're going to Define two parameters here a it's going to be an INT a b also on it n is going to return the sound so we put colon at the end of our parenthesis or function we put int because this is what you're going to return and we put calibration type return a plus b or you can put this in a single body expression function so you can put the code like this if you want so we can put here uh you can also delete a type you can put here equals and this will work but I'm gonna keep it like this now if you want to use this sum function that is defined in this uh class calculator first you need to create an object without class so we type here Val I'm going to call it calculator and I'm gonna create here a new object calculator Constructor doesn't have any properties any parameters and if you want to to call that some function we need to use our calculator variable or I'll confrater object or reference and we put dot like we did in our research so use the dot notation so now we're calling the sum function on our calculator object that we created online too let me put when we call our function sum inside the buttons you pass two numbers let's say 5 and 10. and uh let's capture this value that is returned by the by the function in a variable so let's put here Val result because that is going to return the sum of 5 and 10. of course that you can put that in a printerland statement if one but I put it in this elaborate way to to make more clear what you're doing and here I'm going to type println result so now if I run the squad you're gonna see 15 in output line in the console so let's increase this so we have 15. and the way we did it is we created an object like we did so many times then we want that object use the dot notation to curl that function on that specific object on this object and that function takes as arguments as easy as values to its parameters to integers we pass 5 and 10 and then it returns as well and we retain we we capture that value in the result variable and then we want to put that value in the console and get 15. but um if you think about the way we did this thing is that the only way we can call the sum function is by creating an object and then calling the function on that object but it doesn't make a lot of sense if you have a calculator class to call to create every time through our code every time you need to use the sound function to create an object throughout your code a better way it would be if you could call that sum function somehow without declaring uh without creating an object and then using the the object to call the function and to you to do that we need to use what is called a companion object and to use a component object we go inside our class we type companion object so we can press enter to fill in a component object for us or you can type that then we put curly braces and inside the curl brace you put our codes and in this case we're going to put our sum function now you you're going to see something now we have an error here now this function this sum function doesn't belong to an object to an instance that is created with the class calculator instead it belongs to the class itself and not to the not to any object that we create those the variables and the functions that are the functions that are declared inside the component object are also called class variables or class functions because they don't belong to they don't belong to a specific object that you create with that with that class instead they belong to the class itself so you don't need an instance to call that function and uh that uh implies that we can't use it with an object because it belongs only to the class and let's see how you can use it using the class without creating an object we just type calculator dot sum and here you pass again 5 and 10. so we just use our name or the name of our class we put dot sum and now we can use the function without uh then without us needing to create an object and then calling the function on that object so this is a very powerful because uh you will need this in your code sometimes when you don't uh it it actually doesn't make sense to create an object every time you you call let's say a sum function for a calculator now we can also retain that value that is written in a variable also result put equals now we can print this in the console so we get also 15 but this time we didn't create an object we didn't create a new instance and we call that we call the sum function on that object we just type the calculator class and call that function on directly on the class all right so this is how you can use the companion object and this is also true for a variable so if you put a variable here let's say Max and you put an arbitrary number here let's say 100 we can call this variable also by typing calculator the name of the class Dot and have our Max variable uh like in contrast with how we did the how you call the the properties in the past by creating an object and using that object to curl that property on that object in this case you just use the class and call the the variable and this also can be can be useful if you have some constants to which you want to use in our throughout your quad so let's delete this so you can use also with variables and if you think about uh uh at our one of our first lessons about the data ties when you look at the minimum and maximum value I I type something like this Val Max and I to get the maximum volume I type int that max volume and this is using also a companion object because as you can see the integer class because the Primitive types are also classes at least on the surface not when they are compiled on the jvm they also use companion objects like we have here to to get to to get the properties and to get the functions because you don't we didn't create an instance of our integer of with our integer class and then call that max value on the object in fact if you hold control on this integer class and if you actually hover over it and after you hold Ctrl it says public companion object of int so if you hold Ctrl and if you press and if you press click now it will open this primitives.kt file and inside primitive.gt if I have our end class and we have a companion object inside the companion you have this public constant value we're going to look at the constants in the negative but the point here is that it's using the companion object to to declare is declaring the the this minimum value the maximum value inside The Company audio so that you don't need to create an instance an object every time you need to use them so this is our discussion about compounding object and see you on the next video I'm going to close this file now and if you if you want you can look you can look in that Primitives file if you want just take a look look what is there so see in the next video so now it's time to start a discussion about Singleton but first i'm going to copy this code I'm going to copy this class with the companion object and I'm going to paste it inside the classes file and if you don't have this code Discord because you create a new project just type the code that I'm going to type in a second so let's delete the code inside the main function now what is a single then a Singleton is a design pattern in kotlin with which you want to have only one instance of a particular web object so you want to have only one instance of a particular object and you want to have that instance available globally tutorial program so you don't need to create an instance every time you need to use that that object in a different part of your code and there are project practical reason for having only one instance of a class let's say that you have a database you want to you want to have only one instance of that database which creates the database which gives the data and so on because if you have multiple instances if you able you are able to create multiple objects with that class then you'll have multiple databases in your phone or on our PC and that is not good because you're using more memory than you should and you have a duplicate duplicated duplicated and unnecessary code so to solve that what we need to do is to create only one instance of a particular class and uh having this example in mind this is what we're gonna do next and first I'm going to show you how we we did the in the past how we created a Singleton without having the object keyword so you go down here and first we're going to create a Singleton in the world wave so we type here class you're going to use our example database not going to create a real database we're gonna just use this as an example and to make to restrict the creation of instances with this database class we need to make the Constructor private so we type private and uh when you use an access modifier with the primary Constructor you need to use the Constructor keyword other otherwise will have an error so if I delete the Constructor keyword here I have an error which says after modifiers or Pro of primary Constructors so we put Constructor and inside the inside the glass now because we cannot create instances of this class that means that we cannot uh access any of the properties or the functions of this class and to to to have access to a function which is going to return an instance of this class we need to use a companion object because with companion like this you can have properties and functions being allowed to being to be accessed outside of the class without creating an instance and here we type again the private access modifier we call this instance and it's going to be a database a nullable database should be valid there instance database and as I said nullable so we can assign null to it then we Define a function called get instance and this function is going to return an instance so for instance of our database class only one instance one one single instance not multiple instances and to do that first to check to see if the instance is null so if this is the first time that we want to access this uh instance then it's gonna return true if not it's going to return false so it checks if it's equal to null if it's equal to null so our instance hasn't been initialized you know type instance equals to database right so if the instance is equal to nulled that means that the instance has been initialized we initialize the database so we can initialize the class inside the class we cannot initialize it outside else so if this condition fails the the code below is going to be red else you're gonna return the instance so if the instance is not null and this uh this code is not going to be a this condition is going to be false and the code will not be as a good inside the if it's gonna we're gonna return the instance but here you go you should return the database and it should be a knowledgeable database what is our Arrow disappeared let's delete this let's press Ctrl alt there all right now how we're gonna use this first we type here Val instance input equals and type database Dot and I'm going to use our function get instance and uh if we we print this instance in the console so we type here instance if you run the squad so now we're calling the fan gets instance inside the company of object we get this code that this code represents the location memory of the instance so we have this code here and if we try to instantiate this class so we put here the Constructor if we do that then we get an error because the Constructor is private so we cannot create an instance and when you call the get instance function so when we did this first check to see if the instance was equal to null and it was equal so now then created the instance and then it returned the instance but if you call this function again so let's call it instance2 because database that get instance now this will evaluate to false because the instance is not equal to null we have an instance and it's going to come down here and it's going to return the instance they're already creating instance so if I put a printerland here and I'm gonna output the instance tool you're gonna see that there is no instance to you have the same instance because it's you it's returning already creating created the instance so we have the same code here meaning this translates to that you have the same instance so no matter how many times you use database I get instance if it's the first time then it's going to create the instance and it's going to return in essence if you call that again like we do for instance 2 then it's gonna return the already created users so in this way you have the same instance no matter how many times you you call the get instance function because it will always return the same instance because we because of our logic that we created here but there is a shorter way to achieve the same thing by using the object keyword and this is what we're gonna do next so let's close this now let's see how we can create a Singleton and which is going to have the same behavior that we created here so it's gonna be only one instance using the object keyword so I'm going to type down here object I'm going to call it database now let's delete this code because we cannot have a two objects which have the same name and we cannot have a Constructor here because it's a Singleton so you put only curly braces you can have properties and functions inside the Singleton created with you with the object kios leslie.com inside Dimension frame function too so uh Now by just typing object database now we have the same thing that we had previously just by typing object and database so this will always return the same instance and we have only this code object and the name of the object so the in the instance of the object is going to be created the first time you call it and we can put an initializer block to have some code to be executed here so let's put a printerland let's say yo this is a database created and to you to use this just type let's put a printerland and type database and now if you run this and the first time you call the Singleton that time the Singleton is going to be it's going to be created so I have database created then we have this code which represents the or Stringer is the string representation of the object and if you press Ctrl D here look what happens we have database created so because this is only one instance this object is a single turn it calls the initializer block only once when it initializes itself so when we call the database for the first time it is initialized and it calls the code inside the init block and after that it only it output this thing representation the second time we call the database we don't have database created because the instance was already created and the initializer block is not called again because we have the same instance so if you can press Ctrl D here multiple times and we're gonna see that we have the database created with only one one uh once because that is called only when the only when the object is created for the first time so on this line in the next slide we have the same uh the same objects we have here this this is why I have the same code because it's basically the same instance so as you can see this is a lot simpler and um more concise than the code that had previously so this is how you can create a Singleton in kotlin this is why this is how we should do it so see in the next video so now it's time to start a discussion about lazy initialization but first i'm going to copy this Singleton and solid hour classes file and if you don't have this file because you created a new project again just type the code that I'm going to type in a second so I'm going to delete this now what is lazy initialization lazy initialization is used when creating an instance when creating an object is expensive and the expensive in the programming context means that it will take some time it will use some memory and in that case it's recommended to use lazy initialization and to illustrate the lazy initialization I'm going to use our user class so I'm going to compare user class inside order main file not because I can create here an object by having the file here but because I want to put the code here to make clear what I'm doing so I'm gonna delete the code from here and if you don't have the file just create a new class called user Define the properties for its name last name and age I'm gonna delete this because you don't need this and inside our user class I'm going to put initialize an initializer block which is going to be called every time you create a new object and here we're gonna put a printer printer print line statement which is gonna say user when I call the first name property so the value that Sparks the first name property was created so let's create a new object here let's call it user1 equals user now let's put some values to the properties of the Constructor let's say Alex now if you run the squad we get in the output user and the value for the first name property Alex was created if I press Ctrl d and I change this to user 2. and let's change this to a generic name user for the last nameless pass just the last name text and let's skip that age so if I run this code now because now on the line 3 you create a new object the initializer block is going to be called again because we create a new object which is user user was created now to initialize our user 2 with the lazy initializer we just delete this and to illustrate how the initializer block works we delete this and we put after user to buy so we put the keyword by and we type lazy and as I'm typing you see that I have that black lace press enter and put the curly braces and inside the calibration we create our object so user and here to pass the values to the properties so let's put user one let's pass last name and for the age let's put zero now previously when the user was initialized in the world way I found out the user user was created so the initializer block was called when he created the second level but now if I run this code look what happens we get only our first object we get the initializer black only called for our first object and for our second object initialize using the lazy initialization we don't have the initialize of law because the object is not initialized is the object is only going to be initialized when you use that um object in your code so if you use that object somewhere in a code the object then is going to be initialized and it's going to be used so if I type here a println which says user DOT first name user tool now if I run this now because I know I'm I am using the user 2 object now the user to object instance is going to be created and then I'm gonna see user 2. first name so now we see user let's see user 1 was created so the initializer block was called because when we called the the print line user to that first name then in that at that moment it created the instance and then it outputted the user one so this is why now we see here user one one was created and previously we didn't because now we're using the user to object in our code so unless you are not using the the instance the object that have created using the lazy initializer it is not going to be initialized so this is initializer this is initialization by lazy so see in the next video so now it's time to start a discussion about enum classes but first i'm going to copy our user class inside our classes file now I'm going to delete this class and also I'm going to delete the code inside the main function now what are the num classes in on classes are used when we want to represent a fixed set of values so when you want to represent we want to create some constants you should use genomes because enums are like constants but they are more powerful because you can they can have properties and they can also have functions and you know I'm sorry usually used in um if conditioners or if statements or in in the when statement or if I want to call it the if statement expression or when statement expression now let's see how I can create any number class and to create any num class just type here enum the keyword enum and as I'm typing I have some suggestions then we put class and let's call this uh you know class directions Direction actually then you put curly braces and inside the enumclass direction we Define our enum values so here we Define North put comma enter South you can put them in one line just to have comma between them East and west right so we have our enums values defined inside our Direction enum class and those enums values that we have here here they are instances of our enum class Direction so they are an instance there an object created inside the enumclass direction just that they have this different name and as you can see the name of the you know values should be all the names should be in uppercase letters now let's see how we can access those you know values to access the you know values we can let's put the printer line here we type Direction then we press Dot and we have some some suggestions here we have west east north and south so we have our enum values suggested so let's choose West let's output this in the console so we get West so this is the enum value West and um let's press Ctrl d let's change this to East so let's change this to East let's change this to North and South now if you run this code we get our enum values West is north and south so this is how you can get the you know the how you can get the genome values that you define inside your genome class now we can also you can also pass you can define a Constructor here for our enumclass and Define some properties like VAR let's call it Direction of type string and VAR distance and this is going to be an integer now if you hover over here you have some underlines and the underlines if you have always says that you Nam has not the full Constructor so now because as I said those elements values are instances they are objects created inside the original class now we need to pass some values to the properties that we Define here so let's pass some values here so let's press let's type here first North again I'm gonna speed up this now a little bit all right so now what we did here we passed some values to the you know values Constructors because in in up here in our enumclass direction we Define some properties and those properties because the enum values are objects they are instances for a number directions even though they have those different names you need to pass to the constructors then some value so we pass here north south east west and password for for the densest distance 10 20 50 and 40. now let's see how we can Loop through our enum's values and to do that we just delete this code and what if and here we add the four groups so we type four let's call it the Direction in and here we type Direction our enorm class dot values and this is going to return an array with all the enum values that are defined in our class now let's put calibrases and let's draw the printerland and let's put in the direction so now if you run this you'll see the same output but in the order that they are defined inside the class so we see the same not the same output because they are outputted in the order in which they are defined in the class so we have north south east and west and this is how we can Loop through an enum to through the enum values of a num class so this is how you do it so now let's delete this code now if you want to access the arguments that are passed to our enum values Constructors we just first put a printerland to Output the values on the console and type Direction so our rename class Dot and we choose our in our value let's choose North and from here and here now we type also that and now we have some suggestions we have Direction distance and we also have a name and name is uh is a variable which is not defined by us so we've only defined those properties direction and distance but name is variable which is built in in the enumclass similar to the the the direction that values which return the array is the the direction that values values was also uh property which actually it was an array property which was built into the enumclass so we didn't create that it's provided by the enumclass so this is why we have that name there so let's put Direction let's press Ctrl d uplicate this code and let's change this to the instance let's press Ctrl D again and let's also print that name which is the built-in variable which is the built-in variable provided by the NM class so let's put here name now if we run this code get North so this is the value that you pass here we get 10 and then we get North with capital letter so so we get the value that we passed here for direction and distance which are defined in Direction class so we get the value spots for this specific you know more volume and then we get the North and this is the built-in um variable which is uh provided by you by Dynam class but as I said you can also have functions so let's have a function which Returns the direction and distance so let's type here fun we call it print data because it's gonna print the data of a specific in our value it's not going to take any input put curly braces but now we have an error here that is because uh when you declare a function inside the nenum class you need to provide a semicolon for the last in um defined in our class so I need to put here a semicolon and there will disappear and let's print the data here let's add the println let's put quotation marks as for Direction equals dollar sign Direction and distance equals dollar sign distance now if you call this wanna our wanna enam valueless type direction that let's say West Dot and now we have our function print data so this print data function is going to put in the data of the West enum that is defined here so it's going to Output West and 40 in the console so you know if you run this code we get direction West and distance 40. so this is how you can use functions inside the noun classes next let's see how we can use our enum Direction and generally how we can use enums with the when statement expression so I'm going to close the console I'm going to delete this code and the print data function works for all of our Renown values so let's delete this and here I'm going to Define a variable it's going to be a Val it's going to be called Direction we're going to put equals and hero type Direction our enumclass let's choose East so now the enum actually is the west east so now our Direction enum is is going to be stored in our Direction variable let's use the when statement expression and we type here when Direction then you put curly braces and here we type Direction Dot East I'm gonna put Auto execute this course so print the Len the direction is yes and we'll do the same thing for the next one so let's press Ctrl d let's change this to West North and South so this is how you can use the enorms with the one statement now if I run this actually I should change the text there but I'm going to change it so let's close this to change the text here now if you run this you're gonna see the direction it sees because this condition is true our Direction argument here is going to match with this Branch so it's going to evaluate true and then it's going to execute this code you can pull calibrations if you want but as I said in our discussion about the when statement expression you should do scary braces if you have multiple lines of code in our case we have one single line of code but you can put curly braces if you want and of course that this Branch will always evaluate to true because here we type direction that is into our Direction variable literally directly and this value doesn't change but in real up this value could come from a database or from the user input and in that case you need to use the function which is also built into the enorma class and that function is called value of so we type Direction dot value of and this value function check his checks to see if our value that we pass here exists inside our enumclass so it checks to see if is defined here and it all it also returns that value so if I type here yeast now if I run this code we get an error which has no num constant direction that is because all of our enum values have they are defined in uppercase letters but if I put here that uppercase and if I run this code now we get the direction assist and uh this value that we have here is this value as I said could come from a database or from the user input and the direction that value of is going to check to see if this you know value exists in our rename class and it's going to return that value in our variable so it's going to assign that value to our variable so see you in the next video so now it's time to start a discussion about inner classes so what are inner classes in our classes are classes which are declared inside another class and they are generally used when you know that there is a very close relationship between two classes so when it doesn't make sense to put two classes separated then you should use inner classes and let's look at an example and we're going to imagine here that we have a list View and this list video list view is gonna display some items in a list in on the screen and here we're going to use inner classes because for displaying the each individual item we're gonna create a list view item so first you create a class called list View foreign we Define a property called items and it's going to be an array of strings now we put curly braces and inside the class we type the keyword inner then class and now we create a class which is going to represent the individual items in the list view so we put type here list view item put the the primary Constructor but we put not we don't Define any properties and then we put curly braces and this inner class let's use gonna have a function called display item and it's going to display the value the values of an item of other specific position so we put here position let's say Define a parameter to our function it's going to be an end and we're just gonna type here print line and the inner classes are have access to the properties of the outer class so inside our inner classes that we have here we can have we can access the properties that are defined inside the outer class list view in this case we have a single property called items and here we can type items and notice that I can use the items property which is defined in our outer class list view we type position and this is going to return an item at this position which is passed as an argument here to to do our parameter position and we go up here and we type Val list View because we're going to create an instance for this View type list View now we need to pass an array to our primary Constructor to the property item so we type here array off and we Define some generic names here let's say uh name one and name four now how can we access the display item function which is inside our inner class list item list view items this this should be list view item not items so let's change this go right click on it and go to refactor and rename let's call it the items press enter now to access the display item function which is inside the original class list view item we type list View so our instance our object list view Dot list view item and then again that and now we have our function display item and we can pass here let's say yo let's say uh two now if you run this code so get in the output name tree and this is correct because it entries the other index too and this is how you can access the display how this how you can access generally a function inside then uh in inside an inner class you just create an instance of the outer class then you call a you call the name of the class of the name of the inner class and then you call the function Auto so see you in the next video so now it's time to do a challenge using the knowledge that we have about object oriented programming and the challenge is to create a class which is going to represent a bank account of a person and this class is going to have three properties the first one is going to be called the account name the second one is going to be called the balance and the third one is going to be called transactions and it should be a multiple list also you should create functions for deposit and withdraw and also function for calculating the balance and you also you also should add the the checks for checking to see if the amount is uh when you deposit the amount is greater than zero and all of that stuff so do this Challenge and then watch my solution so my solution is this I'm going to create the class and for this challenge you should also have in mind the discussion that you had about access modifiers so I'm gonna call it account and I'm going to Define here a property called the we're gonna be called the Val is going to be called the count uh name and it's going to be of type string of type string and we put curly braces and inside the class I'm gonna declare the next two properties and those one uh first I'm going to declare it without the access modifiers because IntelliJ probably is gonna figure out that we need to put access modifiers on them so I'm gonna type VAR balance and I'm gonna assign 0 so this is the default value and VAR transactions and this is going to be equals to a multiple or Multiple List of int because this this is going to store the transactions so these are the three properties of our class now I'm gonna create the first function which is going to be called deposit and this function is going to be used to deposit money inside our bank account and it's going to have a parameter called the mount it's going to be of type end and first we need to check if this amount is greater than zero because you don't want to deposit uh negative value so if amount is greater than zero and we choose greater than zero because we also don't want to deposit zero so this is why I put greater than zero then if it is greater than zero then I'm gonna add that to our transaction list that add amount and then I'm gonna say balance I'm gonna update our balance I'm gonna put plus equals amount then we're gonna add the print line which is gonna say I'm going to put the quotation marks dollar sign I'm gonna type amount I'm gonna put dollar sign this dot balance so I'm gonna output in the console what is the balance but if the amount that is passed to this function is a negative sum I'm gonna go in the else part and we're gonna say another print line here which is going to say cannot deposit negative sums so we're gonna put here okay cannot deposit negative sums so this is our deposit function next I'm going to create another function and this is going to be called withdraw and this is going to be used for withdraw withdrawing mine so we type fun with draw and we put parenthesis and this is gonna take a parameter called with draw wool so uh it should be like this and it's going to be an integer we put curly braces now it should be with with here with with draw now we need to convert this into negative sum because now we're uh withdrawing money from autocon so first we need to check if and we're going to put minus because I'm gonna convert this into a negative sum withdrawal is less than zero so if this is a negative sum which is going to be withdrawal you're gonna I'm gonna add to our transactions is transactions that add and you also put the minus sign so you put minus with drawal because now we're adding now we're uh we're taking money off the of our account then I'm gonna put this that balance my uh Plus equals minus withdrawal because now we're taking money and then we're going to add again a print line it's going to be this one so I'm going to copy this but now this is going to be the withdrawal else if this is not a negative sum so I'm gonna put else I'm gonna type put in the line cannot wait draw negative sums so if he tries to withdraw a negative sum then we're going to say cannot withdraw a negative sum here we put the minus because we we're taking money out of our account so we need to check for uh that's why we're checking here if this is less than zero shouldn't be negative here and we're going to create another function and this is going to be called calculate balance so we type here fun Let's uh bring this fun calculate calculate balance this is not going to take any parameters and it's going to return an INT put curly braces and I'm gonna put this that balance to zero because I want to calculate the balance I'm going to add the transactions to this property balance so here we're gonna say and here we're gonna loop we're gonna type four turn suction in our list of transactions so for transaction in our list of transaction I'm gonna type this Dot balance plus and equals transaction so our transaction and then we're going to return the balance at the end of our Loop when we end we ended looping so return this Dot balance so this is our solution to the challenge and let's um let's create an account and let's pass some values here so I'm going to type here Val Alex account I'm gonna put equals account I'm gonna put now I'm gonna call the primary Constructor so I'm going to type here Alex and we still use I'm still using my name here but so I'm going to type here Alex account Dot deposit so I'm going to deposit let's say one thousand and uh I'm gonna type OLX account that withdraw I'm gonna withdraw 500 then I'm gonna put Alex account and I'm gonna put uh deposit the negative sign let's say minus 20. and Alex account Dot that we draw also negative sign let's say minus 100. now if you're on this code foreign deposit balance is now 1000 so we have our call card called from our deposit function then we have so I should I didn't change the text here so that's why it's saying uh this should say with uh withdrawn so uh sorry let's change this to with drone so let's run our code again so get 1000 deposit balance is now one thousand now we get our uh correct output to get the then 500 withdrawn so get our call the call from our withdrawn function we withdrawn balance is now uh 500 then then you get cannot deposit negative sums cannot withdraw negative sounds because we passed the negative numbers to our deposits and withdrawal function and here we're checking to see if those are negative or positive so this is our solution to our to our Challenge and I hope that you enjoyed this and that you solved this and this is not again the best solution this is just my solution probably you'll find you figure out a better solution maybe your concern better and more concise solution than this actually I forgot before we end our video Let's actually called also our calculate balance function so I'm gonna type here uh Alex account dot calculate balance and this is going to return an integer so I'm gonna type here Val because that function returns something so I need to capture that in a variable so I'm going to type here valve balance equals Alex account so no other print line here and there's gonna say balance is dollar sign balance format the code now if we run this code [Music] now get our previous output to 1000 deposit balance now one thousand five hundred withdrawn balance is now 500 then cannot deposit negative sums and cannot withdraw negative sounds and then get balances now 500 so our code works well so this is our code one more thing that I forgot is that I said at the beginning of the video that you should have in mind the discussion that we had about access modifiers when doing this challenge and I forgot to to add the access modifiers for balance and transactions because now what can I do for balance I can use our Alexa account s and I can type here balance and now because that is uh actually that is not really probably because when I talked about uh get us unsetters we said that that when you access a property you always access access that property through get a run Center so we never access directly the getter and the property but uh still you should not make that that public because by default if you don't provide an access modifier they are they are by default public so if I type here now account balance as you can see I can call that and I can type here 1000 and I can deposit now I can change the balance of the account directly from here and if you hover over here uh IntelliJ figure out that you should make this private so make this private the balance and also the transactions because you don't use them inside the primary Constructor and they are used only through the to the functions that we defined here the because of that you should you should declare them as private because you use them only through the function that you declared inside the class so declare them as private and now you if you hover over here it says you cannot access balance because it's private in account and now we cannot change the balance from outside the class we can only deposit or withdraw uh sums of money from our bank account by interacting only with the functions and not by calling the property directly and assigning a new balance to to the property so make them private and this way you cannot uh you don't uh you don't access the property outside of the class and you change data directly the the value of the property again it's not really direct because the code that you had previously so this code actually is calling the setter here but still you can change the value of the balance but now because we made that private and the the compiler is smart enough to figure out that because they are not declared inside the primary Concepts and they are only used you only interact with them with the deposit and withdraw and uh calculate balance functions so we don't use them outside you don't have them also declaring the primary Constructor it knows that you should make them private because you interact them only with the functions and now we have this underline because it's private so we cannot change this balance now from outside the class we can only interact them again using the functions so I'm gonna delete this and now see you in the next video so let's delete this so actually I'm gonna let it there because it's uh good to see so now it's time to start a discussion about inheritance so what is inheritance inheritance is the concept in the quarterly programming context with which you can create a class using another class so in other words you can get all the functions and properties that have that the class already has in your new class and in addition to the getting all the functions in properties in uh in your new class you can add some new functions some new properties which are specific to this new class but they aren't for the also this the class from which you are inheriting is called The Base Class the parent class or the super class and you might be wondering why is this useful why you want to do this let's say that you have a very big class which performs very hard task and has a lot of functions in coding but you want to create a new class which is slightly different from this class what you can do is you can get all that code copied in the new class and then you can add your new functions or new your new Behavior to this class but dust is not recommended because you have duplicate code what you can do instead is you can inherit all the functions and properties which this big class already has and in your new class you can add the new functionality the new Behavior which is specific to this new class but it's not for the base class so in this way you can uh you you avoid the duplicated code and you increase the code reusability and for that I'm going to show you in an example and I'm going to create two classes one is going to be called car and one is going to be plain so we create here a class we go down here we type class I'm going to call it car is going to have some properties the first one is going to be called name this is going to be the brand name of the car the second one is going to be color also string engines the number of engines that this car has gonna be an integer and Val this is going to be doors so we're gonna store the number of doors all right we put curly braces because I'm gonna add some functions to this class to function actually fun move and uh fun stop and here you're gonna say print line quotation marks dollar sign the name of the car is moving similarly down here in the stop we're going to say the car has stopped car has and we're gonna create a another class called plane which is going to have also Val name we're gonna be a string a vowel color also string Val engines an integer and the valve doors unint put curly braces and we Define those two function we're going to copy those I'm gonna paste it here so now what we did here is that we created two classes they both both have uh properties for the primary Constructors and but as you probably already noticed we have the same properties we have the name here we have the name there we have the color there we have the color here the color there the engines also we have here and there and we also have those functions which are almost actually are the same so we have what I said at the beginning duplicated code so it doesn't make sense to put this code here another another way to do this is to create a base class a generic class called vehicle which is uh and usually you create the generic class when you know that several classes we are gonna share those properties and those behaviors so a car in the plane both are Vehicles so we can put here instead of declaring the the name and the caller inside the our inside our classes car and plane you can put this in a vague vehicle uh class in a base class and we can inherit those properties in our classes instead of declaring them your inside our car and playing class so we can put here Val name it's going to be a string and the Val color also string now I can copy those two let's put curly braces here and I can paste it paste it here so now I can delete those those two functions from our classes and what we can do now is we can inherit those properties so we can delete those properties that we have here we cannot we will as you'll see you'll need to declare them as parameters but uh they are not they're not going to be as properties in any they're not going to be as properties here now what we can do is that we can inherit this shared those share the functions and those shared properties because both the car and the plane have a function to move have a function to stop the baby they both share a name they both share a color so they both share those properties and uh functions but uh as we did previously is to put them inside the the the classes would not it's not good because we have a duplicated code and in this way we put this code here and now we can inherit this code so we can have this code directly you can you can have this code the being uh being accessed inside the car and plane without declaring them in our classes so to inherit from our class first you need to Mark the class from which you want to inherit as open because by default they are they you cannot inherit from a class so if I enter in head from a class we go at the enclosing impurities of our primary Constructor we put colon and we type the name of the class from which we want to inherit and in this case it's going to be vehicle now if you hover over here it says that this type has a Constructor and thus mods B initialized here and and next you say this type is final so it cannot be inherited from and that means that we cannot inherit from this class unless we mark this class with the open keyword in front of it so we need to put here open and now if we hover over here now we don't have that error you only have this here which is this type has a Constructor and dust must be initialized here and that basically means that it says hey I'm trying to use this vehicle class I'm trying to but in order to use it I mean I need to initialize this vehicle class so we need to pass some values to the construct of the primary Constructor that is defined here you need to pass some values to the name and to color and to do that we Define here name we type name actually dot let's press Ctrl Z let's put a space and we type name we put comma then we type color and notice that we don't have the VAR or the Vault keyword in front of them that is because the those parameters that would have here because they are parameters because they don't have the value of our keyword they they uh they they they have to be declared only as parameters because the properties are going to be declared and they are declared by the primary Constructor of the base class from which we are inheriting from and because of that we don't we we don't we don't need to declare the property again here as you can see if I put the VAR keyword we have an error says name hyzer anyway what that means that we cannot have the property declared here because the properties uh already declared inside the Base Class inside the vehicle class from which we are inheriting from what we can do here is Define the parameters and the value that is passed to those parameters so the primary Constructor of the class cards are going to be passed to the to the vehicle primary Constructor so hero put the primary Constructor so you put two parentheses and we type name and this name is this one from here so we type name then we put comma because we need to pass a value for the second one for the color and the type color and this color is this color here so we type color now if you go up here let's say for let's look first as the actually let's also inherit from inherit inherit also one in on the plane class so we put colon also here we type vehicle and now we need to also to Define here the parameters the name and the color so we type name and at the time you can see that IntelliJ has given us some hints so if I type here color it says that color string so it's very helpful put colon we pass those values to primary Constructor of the base class so we type name color and now if I go up here on I create some instances of our car and playing class so we type here Val car let's put equals this type card let's choose for the name BMV and the for the color let's say red for the engines one for the doors four now I'm going to create also an object with our plane so let's press Ctrl alt form on the code valve plane equals plane so our class we type here for the name for the color let's say or white and blue and for the engines for and for the doors let's see also for now if I go down here and I type here car dot if you look here you see that you see that we have the function stop and the function move but we didn't declare them here you deleted them previously but because we are inheriting from the vehicle class because when you are in editing the properties and the functions from the class from which you are inheriting from are part of the new classes so the the the move function in the stop function they are now part of our color class similarly it's the same in the same the same here the the the the move and stop are uh are part of the class plane so if I type here car dot move and car dot stop and then plane dot move and plane so look like then now I can call them like they are declared inside the our current plane but they are not there but because we are inheriting they are part of the class so you can think of you can think of this thing that we have here as a single entity so it acts like a single entity so now if you run the squad we get in the output band there is moving then they have stopped bearing is moving doing has stopped and uh this uh we get this output because as I said those functions are part of our classes and they are using the name so in this case the name that is passed to the car this name that we have here been there is passed to the to the primary Constructor of the base class and then it's used here so it's calling the movement save and there is moving so in the same way for the for the plane we get the same output it gets the value that is passed here viewing and then it outputs the viewing is moving and then it has stopped but we can do even more we can override those functions inside our class so we can create a version which is inside the base class from your inheriting we can create a version of this function which is specific to the car or which is specific to the plane and I'm gonna look at that so now I'm going to override the move function from our Base Class vehicle inside our playing class because I want to make the move function specific to the playing class so I want to provide I want to provide an implementation of the move class which is specific to a plane so how is our plane is moving a plane is moving by flying so I'm not satisfied with only this generic function which says the name of the vehicle is moving and to override the function you first need to Mark Mark the function similarly to to the class we need to mark it with the open keyword so we type open because kotlin wants to make things explicit so we put open and now we can we can we can override that function inside our plane class so we go to to override the function go to code generate and here we have vehicles in harsh code tostring and go to override methods and you you have those equals hash code into string and those are here because every class that you create in Kathleen is implicitly inheriting from the any class but we're gonna look at that on but more more on that later because you look at that in a different video and we have our function move and stop so the the idea is telling us that those are the functions which can be overridden inside our plane class from our vehicle Base Class so we choose move we press ok and you have this super dot move we're gonna see middle what is this and you can also override it by just typing the keyword override and you can override the function so you can type here override and while I type in you see that we have this override fan move stop or and have also those so we choose move and I have the same thing now super dot move means that call the function so super means call something from our base class in this case call the move function from our Base Class so we're gonna let that here but in addition to that we're going to add a new function so we're going to type here fun flying because the plane is flying and we're just gonna have a simple print line which is going to say put quotation marks let's bring this down a little bit a plane is flying so now I'm gonna call this function flying inside our move function which was overridden so we type flying flying now if we run this code look what happens if you look in the output to get when they is moving when they have stopped and then we get the apply the plane is flying and then we get bearing is moving and bearing has stopped so what what has happened here now because we where when this function move is called here on our object plane created now it's using our own implementation of the move function and after that so it's using our own implementation it's calling the flying function that we created here because a plane is moving in a specific way is flying and then it's calling super dot move and super dot move is calling the function from the base class so it's calling the function from here so by doing this we made our function specific you make we make the we made the function move specific make the function move unique to the plane class because a plane is moving in a specific way and we can do the same thing for the the car class so uh now you may be wondering why why I didn't declare the inside our Base Class the engines because they are also present in in both classes because when you create a generic class you should only include the commonly used functions commonly used and shared functions and the properties so uh all all vehicles have a name and the color but not all vehicles have engines so this is why I put the engines here so in addition to the name and the color which all vehicles have we added some new properties which are specific to a car similar here in addition to the name and the color which all vehicles have and we've inherited that from our class we add that also engines and doors which those things are in addition they are specific to a plane and more we also override the move function because we're not satisfied with the with the simple move function from our Base Class to include to provide our own implementation of how a plane is moving so you can see that by using an inheritance and adding new properties are the new function you can create more specific classes you can inherit you can also inherit from the car class to create a more specific class you can create a Tesla class and so on so this is what inheritance is and see you in the next video so I thought that's a good idea to show you another example with inheritance and I'm gonna go down here and I'm going to define a class so I'm going to type the keyword class and I'm going to call it View and this view is going to represent a view in uh which is used in Android and if you want Android is just a rectangular area on the screen and it's responsible for drawing and event handling but you're gonna mimic as I said what the view is and uh you know Android or not going to create a view like the one that is in use like the one that's used in Android and we Define the primary Constructor but we're gonna not Define we're not going to Define any properties the primary Constructor and this view is going to have a simple function called Draw and it's going to be responsible for drawing this view on the screen so we type draw and create a function and we're gonna add the simple a simple print line here which is going to say drawing The View so we put here quotation marks drawing The View and uh we're gonna mark this class as open because I want to inherit it from it and we're also going to Mark the function open because I'm going to override that function in the in the next class and because this is a generic View and it's going to have this draw function only this function what you can do let's say that I want to I don't want to create a simple uh a simple view which is just a rectangular area on the screen but I want to create something more specific let's say that I want to create a button in that case instead of creating the button the button from zero because this View in Android has a lot of functions and properties which are responsible for creating the view for handling the events and so on so um because here we have on your simple function but the real view has hundreds of functions and instead of creating our button from zero we can just inherit from The View and we can inherit all the functionality that the view already provides to create a generic View and we can add some unique characteristics characteristics which are specific to a button and in in this case in this way we increase the quad reusability and it's more easy for us to to create the button than rather than creating the button from zero because the view already provides all the tools that you need to create a generic view only we you're gonna inherit all that behavior all that properties but I'm gonna but we're gonna change it a little bit so this is what we're gonna do with the inheritance so we create a new class called button so we Define the primary Constructor and here you can Define some properties which are specific to a button not not just to a generic view which is a rectangular area on the screen so we put Val text and this is going to be a string so our our button will have a text which can be plugged in or signed up and also it's going to have orientation because it's going to be one on a place on the screen on a specific place on the screen and this is going to be a string of course you just only Mimi only mimic the View and button which are are used in Android this is why we have so many we see we have so little properties and only a simple function function in our view draw and we put uh here colon to inherit from our view because I want to inherit all that functionality all that properties that a view provides but I wonder is just to change it a little bit to make it more specific I want to make a button and of course as I said this is just uh an example we don't have but in a real in a real app this will have a hundreds or thousands of line of code and we can inherit all of that behavior or that functionality in our new New View which is a button but you can override some functions and you can provide some you can create a more specific view than a general review so you don't need to define the primary Constructor and you put the curly braces now I want to override the draw functions so that when the draw when the draw function is called I want to not drawing just a generic view but to draw a button of course as I said this is just an imaginary example so we type overwrite fundra and instead of calling the super function which is inside our our Base Class View or parent Class View I'm gonna type here print line and we're gonna put the text drawing the button of course and now what we did here we created the generic view as I said and again this can have hundreds of maybe thousands of line of code and functions and different functions different properties but we we inherited from The View class and we added some new functionality so instead of just drawing a generic view now of course we just add a simple print line here but here you can have the code which is going to be responsible for drawing a speed a button so it's going to be more specific than a simple generic view so you can put here a here is the code for creating the button so I'm going to put the Commander and let's say that now I want to create a run around button so instead of creating again all that functionality which which is present in the view and then create and then use and then creating all the functionality which is uh inside the button the button class we can make this button uh open and we can inherit all the functionality that the button provides and we're gonna add something new something unique to this class that we're going to create and this class is going to be a round button so we type here round button and here you need to define the text because we're going to inherit from the for the from the class button orientation and notice that I don't use the VAR or the VAR keyword here because they they're going to be only parameters because the properties the actual property is going to be are going to be um ultimately declared in the button class and one thing which is going to be specific to a round button that you're going to create is going to be Corners so we type Val corners it was gonna be an integer because the the corners basically here are going to pass a value which is gonna in our marginal example this is going to receive a value which can be um in degrees so how many degrees do you want to how many degrees you want to make the buttons by how many degrees you want to make the button around so it can pass here 20 or 30 anyway so we put colon here and we inherit now from our button class right and here you need to pass the text the orientation and that's all and you put calibrases now let's override the draw function in our round button because when that function is called now I want to add some specific code some new functionality which is specific to a round button so it's not gonna draw just a button but it's gonna draw a round button so we of course we're just going to add the simple print line there but um in a real app you can put here the actual cottage which is gonna draw the round butter so we put here print line and we put rowing the round button now let's create some instances let's create some objects with those classes and we type here Val view so we're going to create our generic View we Define the battery Constructor we don't have to pass any values there because we didn't Define any properties inside our view then we create a button so we put here Val button equals button and you don't need to pass some value so I'm going to pass here the text let's say login the orientation let's say yo it's going to be a text here so we put here let's say Center next we create a new a new object but this is going to be now a run around the button so we put around button equals round button and you pass the text here round button actually let's pause it takes uh sign up and uh for the orientation let's put Center also lo you need to pass also value from for the colors let's put let's say 30 degrees it will be in our imaginary example now let's call the function the function draw on all of our objects that we create so we type view dot draw then we put button dot draw and round button dot draw now if you just press Ctrl Z if you run this code so we get in the output drawing The View then we get drawn in the button drawing The View again drawing the round button and let's uh think about why you have this output so first we see that we have drawing The View which is the function inside our view that you created here so it's from the generic view so it's drawing The View then we have drawing the button so here when this line of code is uh red it says drawing the button so you have we have our we have our code which is you know which is with just a print line but uh so this is drawing the the button then it's calling the super function so it's calling the function inside the view which it says drawing The View next when this line of code is red so round that round button that draw now it's calling the draw function which is inside the round button so instead of just now calling the because now we are inheriting from the button class now uh we override this function here and it's it's uh using our implementation for creating a round button it's uh executing this line of code and then it's calling the super implementation which is drawing the button you can actually remove this if you want because you let's say that calling the code inside from the button is not gonna affect our logic so if I delete this now if you run this code now we have drawing the view drawing the button and we have drawing the view drawing the wrong button so now it's not calling here the super so it's not it's not calling the code which is inside the for the bottom because we are inheriting first from the button but but the button is also inheriting from The View so it's calling first this then it's calling draw which is inside here and we have the round but now we only have drawing the wrong button because here now it's using our own implementation of the draw so we have drawing the round button so buy this just by by making our view because as I said in real app this view is can have hundreds of maybe thousands of line of code of different functions and properties so you don't want to create all of that from zero when I want only to let's say I want to create a button I can't inherit I can inherit from The View which already provides all the functions and properties and logic to create a generic view but I can override some functions which are responsible let's say for like this draw and I can ex I can Define some logic and when all of that functionality is called It's Gonna not draw only a generic view but it's gonna draw a button so by inheriting from The View we increase we increase code the code reusability and this is very very powerful because let's say that uh like in our example you want to you don't you're not satisfied with the simple button which is used in Android and you want to create a draw a round button so instead of creating all of that logic from zero you can just inherit from a simple button you can have override some functions and when when you execute that quad now it's gonna execute the code with the implementation with the additional implementation the with the additional code which is which is gonna generate a round button and it's just not just a simple button so this is our this is our discussion about inheritance I hope that this clarifies some things and see you in the next video so now it's time to start a discussion about seal classes so often you want to represent only a fixed set of possibilities so however case can either success or it can fail a user can be a standard user or a pro user and in those cases you may be thinking now that you can use enum classes but enumclasses have some limitations and let's see why you should use instead seal class so let's type Main I'm going to create a in on class here call it the result and let's put curly braces unless I hear success and the error now the problem with this is that we cannot encode more information here so let's say that I want to to to Define here a non-resolvable resolver error and resolver error and I cannot do that here so if I type here x dot exception I can I cannot do that because um the the the the types that are defined here cannot have properties so you cannot Define this here and for that we need to use seal classes and to use the seal class you just type seal class I'm going to call it result it's going to have a parameter called Val message it's going to be of type string and you can Define your uh classes which are gone inherit from the seal class either outside the seal class so you can Target class let's say success and let's type here meh message of type string and we can inherit from the seal class so you can type here result message or you can copy this and you can Define it inside the enumclass so you can have it as an SSC class so I'm going to type another class here called error foreign the parameter here actually not that is the parameter message foreign the parameter here message I'm gonna hit it from the result you know from the results class I'm gonna pass that parameter here to the parent class now I'm gonna Define a function down here called get data fun get data and it's gonna have a parameter called the result it's going to be of type result and here you're going to define a when statement so we type when the type result and now is the interesting part now if you hover over this underline over when it says when expression must be exhaustive unnecessary is error comma is Success branches or else Branch instead so in other words what is saying here by uh to have the one statement exhaustive it's it's what it's saying another word is that it needs to cover all the possibilities so both possibilities that we have here and you can type yourself this or you can click on here click on this right bulb and you can click here add the remaining branches and as you can see it's added the remaining browser you add is result. error and easy result does success and those are exhausted those are the only two possibilities which are which are possible so here I'm gonna type result let's define a function inside the CL class so I'm going to type here fun show message it's gonna have a print line which is going to say result dollar sign message so and now I'm going to put dot show message and also here result dot show message and now this is uh this is uh exhausted because now we call we covered all the possibilities which which are uh inside the which are as a consequence of the fact that we our classes are uh inheriting from the seal class so if I add here an uh else Branch so if I put here else as you can as you you'll see this is going to be redundant because we covered all the possibilities and the compilers know this and this can be very useful in some scenarios so if I put calibrations as you can see this is gray out because it's redundant because it knows that we covered all the possibilities and the possibilities are only those two result that error and result are success so if I type here now success let's type success equals result bo2s there equals result dot success let's type success here let's press Ctrl D let's call this error result let's change this to error so this is how you create instances of the nested classes let's call this failed now let's type here get data down here get data and let's let's pass success and let's run our code now as you'll see the message result success so we get results success in the output so if I change now this to error you will see that this is the result error because it is executing this branch so if I run this to get result failed now the interesting part here is if I add here another possibilities so if I type here class progress and I type message string inheriting from result let's type let's pass the message parameter to the super class to the parent class now what what we have because our class is a sealed class what we have here is that the when is underlined and is trying to say something to us is saying that when expression must be exhaustive unnecessary is progress so it knows that there is another possibility for uh for our result uh we it can be therefore you need to add that possibility otherwise I'm going to show you this order and if you try to compile this code I'm gonna throw an error so what what you can do here is can we can type here is a result to make it exhaustive so to cover all the possibility result of that progress let's put Arrow result dot show message and now if I create here another Val let's call this uh progress because the result dot progress and let's define for the parameter progress here now if I change this to progress now you'll see the output result progress so we get result progress because now this branch is true but if I let's if I delete all of those look what happens if I click here or is where you have those on this underline it says add else Branch so when expression must be exhausted so it means that it needs to cover all the possibility possibilities are necessary is error is progress and is Success so if we click here on more actions and if you click here on ADD remaining branches it it knows that those are all the possibilities on which our result can be and it automatically generated the the check for us and we we only just need to type here result not show message and that's all and with tnumps you you don't have this auto-generated code for you because uh I'm gonna explain immediately so with with an enum if you add another so if you have a Nemo class I can delete the code now here because but I'm going to keep the code as it is and because all the subclasses of excel class are known by the compiler the compiler can fill all the possible cases automatically for us if I declare this Arrow class as a seal class and I declare two classes inside here called let's say class resolvable error so or recoverable error and it's going to have a parameter called exception it's going to be of type exception this one and we're going to extend from our error seal class not this one this one and we're going to pass the message parameter and I'm going to declare another class non-recoverable and it's going to have an exception so this is more powerful than in arms because you can have all those properties and you can you can have subtypes and and all of this and within arms we cannot do this so let's extend from error let's pass the message and now I need to delete this because we cannot instantiate The Shield class so let's delete this now if I delete this now from here look what happens I have an underline and it says add it says one expression must be exhaustive so it must cover all possible cases that that exists for this cell class unnecessary is not recoverable or is recovered or branches so if I click on this and I click on this bulb I click here add remaining branches as you can see it adds all the possible cases so all the possible cases that we Define inside our seal class for us automatically and we just type your result dot show message again here result message and you cannot have this Behavior with the non-class so this is why still classes are more powerful because they can have subclasses you can have more information on the classes so you can have exceptions passed to them and so on so this is our discussion about seal classes and see you in the next video so now it's time to start a discussion about abstract classes and to show you what abstract classes are I'm going to use the code that you had in our discussion about inheritance but I'm going to change it a little bit so I'm going to delete for this class plane because you don't need this class and I'm gonna I'm gonna delete this instances that we have here and I'm going to declare this as a VAR and this also has a VAR so they're gonna be now properties I'm gonna delete the properties that we have here and uh now we have this here so I'm gonna delete these two let's delete this let's delete this now what are abstract classes um abstract classes are very similar to interfaces the only difference is that in abstract classes you can declare properties which can have a value and you know in interfaces you can't actually you can but you you need to provide an access modifier and to declare an abstract class we go in front of the class that you I want to make it abstract and we type the abstract keyword let's put the class keyword and now our class is abstract and with an abstract class you cannot create instances abstract classes are created only to be inherited from uh by other classes and now if I try to create an instance with this abstract class and I just type Val vehicle and we type vehicle here and we put the parenthesis to call the go to the Constructor you have an error here and says cannot create an instance of an abstract class so you cannot create an object with an abstract class an abstract class can only be inherited by another class and abstract classes usually are used like interfaces when you want to provide what you need what needs to be done but you don't provide how it's going to be done so you can you need abstract classes are used when you define uh functions without the body and the code the body and the code is uh it's uh implemented it's provided by the class by the class which inherits from the abstract class so they are as I say similar very similar to interfaces the only difference that in abstract classes you can have properties so you can have here a Val text and you can assign here some text in uh in an interface you cannot do this let's type some text so this is the difference and uh also um you I should say that um you can Implement many as many interfaces as you want but in a class but you can only inherit from a single class right this I forgot to say when I talked about the interfaces now if I want to make uh if I want to if I to make now our functions abstract you just type the keyword abstract in front of them and now they are abstract and we're gonna do the same for our stop function but now we have this underline because as I said abstract functions like interfaces or the functions which are defined in the interfaces cannot have a body so we need to delete this uh you need to delete the body you need to delete the curly braces Because the actual body the actual logic and the code is going to be provided by the class which uh in head is from the abstract class now to inherit from an abstract class we go here we put colon and we type the name of the abstract class from which you want to inherit vehicle now if you go out here now we have this red bar which says so need to call the Constructor here all right actually I think I can delete this but you still you still need to call this Constructor here even though we don't have any any parameters any even though we didn't even Define The Constructor here now we need because like the interface the abstract class if you inherit from an abstract cluster and if that abstract abstract class has some abstract abstract functions defined in it you need to implement those functions inside your class and you go here when you have this underline if you click on this right red bulb and it says Implement members order make car abstract and we click on Implement members we select our two functions we click ok and now we have our functions implemented inside our class so this is what Astra classes are and they are as I said very similar to interfaces but the only difference is that you can Define in properties inside the an abstract class and you can provide the value to that property and here because we we have inherited from our abstract class here you can provide the actual implementation of the functions so as you can see we have this to do which says not yet implemented so they are they are very similar to interfaces so I'm gonna end this video now and see you in the next video but before I end the video I saw that it's a good idea to to say to you where abstract classes and interfaces are used uh interfaces that are using many many places but um abstract classes are particularly used when uh and also interfaces are used when you have some apis and those apis want to just to define the functions and the API is going to generate the actual code for uh for those function so you can have a let's say a database and you can provide the the name of the functions which are responsible for creating the database for getting getting data from the database but you don't provide the actual code which is gonna select that data from the database and return the data you just you just declare your functions as as the abstract and the API is going to generate all that code which is responsible for uh returning the data and from the in other words the API is going to do all the hard work you just you you just Define the the functions if you have if you let's say if you have a property Define an abstract class in the abstract functions or interfaces and the API is going to do the hard work of uh based on what your function is doing by editing the name of the function is going to generate all that code which you you've you've had to generate if you do if you don't have if you're not before the API to generate that for you so this is where uh interfaces and after classes are sometimes used and the interfaces also are used in event handling and that is one in one um uh the you need to write code to respond to respond to respond to graphical using using your interface uh movements so I'm gonna end the video now see you next so now it's time to start a discussion about data classes but in order to understand what data classes are we first need to understand what is the difference between structure equality versus referential equality and to restart the difference I'm going to create two variables the first one is going to be a Val it's going to be called name one and we're gonna assign the follow Alex three so it's going to be of type string now I'm going to press Ctrl D to duplicate that line of code and to declare the second variable which is going to be called name two and it's also going to have the value RX now I'm going to add the printerland here to output something to the console and here we're gonna type name one equals equals name to so the equals to operator is doing what is called is checking for structural equality because it's checking to see if the content of the variable name 1 is the same with the content of the variable name too so another loss is checking to see if they have the same value and it's they have because both have Alex assigned to them so now if I run this code because this is a Boolean expression this is going to return true or false and we're going to see in the console too but if I change this to Alexandro now the variable name 2 has a different value so this is going to return false because they are not structurally equal their content is different they have different values now get false and this is called the structure equality the next type of equality is called referential equality and the reference equality is used when you want to check if two variables or two objects are the same so what the referential equality operator is doing is checking to see if a tool as I said variables or objects are the same so if I type here name one and to use the the reference we call it operator we put three equal sign here and if I type here name one equals name one so is name one equals to itself that is going to be true so you're gonna see through on the console outputted so we have two but if I change name one equals equals equals to name two that is going to return false because they are distinct objects in memory they are different uh variables they are not the same there is the name one name one variable is not the same variable as name two so we're gonna have false here so we have false so this is the difference between a structural versus referential equality so now I'm going to close this I'm going to close the console and having this in mind we're going to start a discussion about data classes so let's go down here and let's create our user class because I want to compare to user objects to see if they are structure equals so you type user let's define the primary Constructor and let's define three properties for the primary Constructor the first name the last name and the age which is going to be an integer now if I want to check if to user objects are a star vehicle let's first create those objects so let's delete this code let's say Val user1 equals now let's create our object and let's pass some values to the properties of the Constructor let's pass here Alex for the last name let's put open and for the age 23. now let's press Ctrl D to duplicate that line of code and to create the second user object let's give a different name to this user too now go down here let's press Ctrl alt alt for mother code we typed our println because I want to check to see if our users objects are equal if they are structurally equal so we type here user1 equals equals so the equals to operator user 2. now if you run this code what do you think you're going to see in the output what you're seeing the output is actually that you'll get we get false and you may be wondering why because if you think about the air structurally because they have the same values for the properties but they are a distinct objects but we said previously that the equals equals uh two equals operator is checking for uh structure equality so why get false here this is because previously the equals to operator is it was checking to see if the two strings are structurally equal and the equals to operator is actually a function which is defined inside the any class and the string class what actually was doing when we called the equals to operator it was using its own implementation of the equals method so uh every class that we create in kotlin it's using its implicitly inheriting from the any class and because every class that we created it's implicitly inheriting from the any class every class is also going to use the functions which are inside the any class so if you don't override those functions inside your class to provide your own implementation like the string class did for our strengths then it's going to use the implicit uh the font is going to use the function which inside which are inside the any class and if you type here user1 that and we have equals to string and hashcode those three but those three functions we are particularly interested and the particular one is interested inside the equals they perform when you don't Implement inside your own class those functions again particularly on Bay course class the equals class spin forums only a referential equality so it only checks if those two users are the same users and if they're not that's gonna it's gonna return false so this is why you get false here because it's calling the function the function which is inside any class so what you have implicitly is something like this so for any class that you you use or for any class that you declare you have implicity inherited from the any class and because of that you have those three functions which are defined and if you don't override them to provide your own implementation then it's going to use the code that's inside there so actually if you press Ctrl here and if you click it takes us inside the any class so it's clear that this function the equals function is inside any class so because we don't have any functions here so we need to override that function inside our class and we need to provide our own implementation to Define our own code to determine if two user are one of when two users are slash legal this is what you're going to Define inside our class so let's delete this let's pull the curly braces and actually I'm gonna bring an image to show you how the quarter and hierarchy actually looks so this is the image and at the top as you can see we have the any class and then we have our Boolean class our string class and then we have our user class and all of those classes I have here the Boolean the string the number they are inheriting from the any class they are using the the functions which are defined inside the any class and they override the they are overriding those methods inside them and they are providing their own implementation for those functions and this is what we need to do also here as you can see they will inherit from the any class implicitly so we need to override them to provide our own implementation for the equals and for the next two because we're going to look at also at the as you saw there you are going to look also at hash code because uh equals and hash code are very linked together and also the two string function so we need to override those uh inside our class so this is what we're gonna do so we go inside our user class and here we need to override the equals function when we type overwrite and while I'm dumping you can see that we have three suggestions here and we select the user function because this is the one that we are interested in and as you can see here this function is part of the any class so we press enter we delete the super return and the first thing that we need to check is to see if the current instance the current object that on which this equals function is called it's comparing with its cell so we need to check if the the if the object is the same as the object that we are comparing with and to do that we type here if this so if this current object is current instance equals equals so three equals we check for referential equality to see if they are the same equals other so we type other and if that is the case if we call we are comparing the same object so you have user one equals user one then gonna return true because that means that uh we are comparing uh with the same object if that is not true then the next thing that we need to check we we're gonna go down here so if not we're not comparing with uh it's not comparing with itself then we need to check if the other so the object which is passed as an argument to this function which is called on another object and to check if other so the argument is user because we we can uh we need to check the expressly to see if this object which is passed as an argument to our equals function is an user object because we don't want to check for a different object we need we need to to see if this is a new zero object so only if the object which is passed as an argument to the equals function is an user object then we're gonna return true so here you need to type now we need to determine we need to Define our Logic for what it means for two users to be equal and it's up to you how we Define this implementation I'm going to type here only return so I'm gonna my logic is if they have the same first name the same last name and the same age we're gonna say that they are equal we have the same user of course that in a real app you can have a more complex implementation so we type here return this so This current instance that first name so and then put two equals other so if so the other is because we check here explicit to see if this is another also because this condition is going to only pass if the other argument is unusual so we type other because we have access to the first name and the last name and the age if other DOT first name so this is our first condition and this Dot this dot last name so I'm going to check for the all uh for our three properties equals equals other so other is another object because we determine that here that last name and this dot age equals equals H so this entire expression that is that we have here is gonna return through only or if all the our three conditionals so if this DOT first name is equal to other that first name so with the object that is passed as an argument or equals and if this data last name is equal to other that last name and if this dot h is equal to the other that age let's put here then and only then we're gonna have a true here so it's going to return through otherwise if one of those condition fails it's gonna return false and down here you need to if other let's say doesn't pass so if other reason is not an user we're gonna return false so in that case going to turn false now if I run this code look what happens so previously we had the false and now we have true here and this is because now it's using the equals function which is inside our user class so it's using our own implementation so it's checked here to see if uh our first name is equal to other DOT first name so it's checking uh so it's using our logic inside the the equals function so this is why you get true and you can also you can now if you press if you hold Ctrl here as you can see now it's taking us inside the equals method that we defined here it's not taking it inside the ionic class this is because now it's using our own implementation so first to check to see if we are dealing with the same object then we're going to return true you're not going to go any any we're not going to go down and if this is false you're gonna come up here you're gonna check to see if other the object which is passed or equals function is an user instance it's an user object then I'm gonna check to see if our current object that we are calling on the sqls function is equal which exclusive for the first name there is the same we check to see if the last name is the same and we check to see if the age is also the same then in that case it's going to return true and we're gonna say that they are structurally equal so we're gonna see through in the output else if other is not an user so if you pass to the function argument the different parameter a different argument here let's say you pass an integer then it's going to return false here we're going to come down here so now if you look here you may be wondering how this syntax works so we have those signs but it's calling the equal smart function so you can also put that equals if it makes more sense and if we put that equals user so so uh now you can see that but if you hover over he says replace with the two equals so it's the same thing as having that equals and passing that argument here which is user two so again we are invoking uh the equals method on the user one object let's press Ctrl J and we are passing our user to objects and we are using our logic that we Define here to determine if they are equal and you can replace this back to to equals or if it makes more visual sense to put the to use the equals you can use equals it's the same thing we put user to here so as you can see we are calling the function so this means this object so this object so defined here this if uh when we're saying this that first name it we we mean this object so if this is that first name it's equal with the other other that first name it's then we are calling this object that is passed here as an argument so um next we will look we're going to look at the next two functions because as I said the equals and hash codes are very linked together and we're going to also look at the the two string function and now if I change the first name for the user 2 to join and if I run this code you will get false in the output because when it will come inside this if it will check to see if this does first name equals to other at first name and because we're using the end operator and all the conditions have to be true this is going to return false so I get false in the output and um but if I change it back to Alex we'll have true so the objects are structurally equal based on the logic that we defined here inside our equals function and as I said you also you can also look at equals and hashcode because they are very linked together and uh the rule is whenever you override equals you also need to override the the hashcode and if two objects are comparing equal so if they are equal based on the equals method that you implemented they also have to have the same hash code and I'm not going to go into that but this is because they are the hash code is used for performers reasons in collections but we're not to go now into that we can just type here override and uh here we just type return zero and this uh this is not gonna affect our equality at all as I said this hash code it will make it makes more sense to implement the hash code in a different way in collections because they are used um for performance reasons particularly with hash set and hashmobs but uh for now for our simple class because we don't use this class inside any collections we don't need because uh we don't uh don't have to think about that per the performance reasons to of the hashcode and uh just if you want to just uh just return zero here like I return and yeah because it would work fine it's not it's not going to affect at all our equality but remember that rulebook that if you override the equals you also have to write a hash code and uh if two objects are comparing equal the more must have the same hashcode this is true as I said particularly in collections not now because we're not using this code inside collection and we can also override the tostring method and this two string method is used to return the string representation of the class so we also type here override and we have our two string function I I said method a few times but there are functions not methods methods are different thing in Java and uh let's delete this function let's type it again so if you can see so this is going to return the string representation of the class so I need to to return here the values that that are passed to our to our first name and last name and age and if we don't do that if you add the print line here and you type user1 let's press Ctrl D and user 2. you're gonna see just some you're gonna see the user and you're gonna see some numbers but we're not gonna see the string representation of the those two users you're not going to see Alex so the name and the age so you see this dosto but uh to avoid that because this also use useful because previously when we want to um output in the console the values of the properties you have to call those properties and to add multiple Sprint lines but with the two string function we can just type here return and type here user we put parenthesis and here we type first name we put equals we put dollar sign let's put a single quotation mark dollar sign first name let's put the quotation marks here a single quotation marks last name equals dollar sign last name let's put inside the single quotation marks this comma and age we put also equals dollar sign h now if you run this code again now it's going to use it's gonna one when we are typing user one and user two is going to use the tostring function that we defined inside your class and it's gonna return the string representation of that specific object so if you run this code we get user and get first name Alex last name Adobe in h23 and get for the second you use their first name Alex last name domain and H22 so now get the string representation of this class and this is uh more beautiful because you don't have to work to always type that user one user1.a user1. last name the first name and so on and for the second object two because now it's using the two string function with our own implementation inside here so this is how you can use the tostring function and this also how you can use the password but as I said hashcode is it's a different discussion which you're gonna have when we're going to talk about collections for now just type return 0 here and then we could all fine and if you think about there is a lot of code just to compare to two objects we have almost 38 line of hold just to to determine if two objects two user objects are equal and we also have to override this not necessary but it will also variety this hash code and the two strings so there is a lot of code just to do this uh simple thing to compare it is to user objects are equal and because kotlin is a byte it's about conciseness we don't actually need to do all of this stuff but I I thought I thought that it is a okay to explain to you what you'll need to do in the past in order to understand what now questioning is doing better especially with data classes so you don't need to type yourself all of this code that you have here you can just so if I delete all of this code let's copy it first and then delete it so if I delete all of this code also the and now if I run this now we get false and we get those we get user and this tag text because now we don't have an implementation of the equals of the two string of the hashcode and if you think as I said it's a lot of code to implement all of that and in kotlin you can just type the data keyword in front of the class and all of that code not specifically the same logic but all of that code that we typed there is going to be generated automatically for you so the equals method is going to be generated the hash code and the tostring and uh the properties which are going to be included inside the implementation of the equals of the inside the of the hash code and inside of the tostring are gonna beat all the properties defined inside the property Constructor so all the properties defined inside the property inside the primary Constructor they're going to be used inside the implementation of the equals of the hashcode and the tostring so we just by putting here the data keyword all of that code all of that logic is going to be implemented for us so if you run this code now so look at this how concise is compared to what happens just one line of code and if if you run our code with the data keyword now as you can see we have true and we have user first name Alex last name so you have the same output as previously and just by putting data keyword all of that was all of these calls so let's press Ctrl J all of this squad not specifically exactly this code but all of this code all the implementation of the equals of the harsh code entry was generated automatically for us just by uh just by putting the data keyword in front of our class and if you don't want to have a property included in the implementation of the of the equals or of the harsh code or of the the two string you can just omit it from here and you just you declare it inside the inside the class so if I put let's say here so if I delete this because data classes cannot have parameters and I declared it inside the class inside the data class VAR age and it will sign a value because we cannot let the property uninitialized let's delete this now and if you run this now that property is going to be excluded from the implementation of the equals the hash code and of the two string so we have here true but we have a first name Alex last name Domi so now the limitation for the equals only includes those properties the first name and the last name and also for the to string function we have only the first name and the last name the age is excluded but let's put this back so this is what data classes are they are generating Auto automatically for you the implementation of the equals the harsh code the two string also for the copy function and for the component function but we're going to look at the copy of copy function in a separate video and they generate all of that code that we saw previously that we talked about automatically for you by just putting the data keyword you put the properties inside the primary Constructor and all of that implementation is going to be generated for you for all the properties you find inside the primary construction and just that just by one line of code all of that logic is generated automatically so this is what data classes are see you in the next video so now it's time to start a discussion about interfaces so what are interfaces interfaces um are you used when you want to have a commonly used Behavior shared among different classes but you don't want to provide the actual code that goes inside the class which is going to implement that interface but you just want to define the the name of the function and the parameter of the function the actual code that goes inside the the functions that you define in inside the interface they are particular to each object that implements that specific interface so let's say that you have let's say that we have some classes let's say that you have a class car a class which is uh which represents a truck and you have a class which represents represents a plane you know that all of those three objects have in common the same behavior of starting the engine let's say and you don't know how each particular class is going to start the engine but you know that each class is gonna have in common this function which is I'm gonna start the engine again you don't care about the particular how each particular object is gonna uh what code goes inside the or what uh logic goes inside The Stand start engine function for each of those particular objects but to care only about the fact that they they share the same behavior they they all start the engine but how they start the engine is uh particular to each class and this is what we do with interfaces we only Define the what so what what we Define in the interface only the the the what and the what represents the what those classes are gonna have in common so you know that they uh gonna have a function called start engine but you don't don't know how each object how each class is gonna Implement that logic and to that to to for that I'm gonna use an interface so we Define what needs to be done but we don't Define how it's going to be done so to declare an interface we go down here at the enclosing calibrates of the main function and we type interface and while I'm typing you see that we have this suggestion we type we press enter we can type the entire word if you want so interface and I'm going to call this internal phase engine and the name of the interface should be with a capital letter to start a capital letter it should be in Pascal case if it has multiple words and the interfaces cannot have Constructors because they cannot be instantiated you cannot create you cannot create an object with an interface interfaces are used only they are created only to be implemented by classes they cannot be instantiated so we need to put curly braces and inside the the body inside the curly braces we Define what needs to be done so we Define only the function we Define we type the name of the function I'm going to call it start engine but we don't Define the actual code for the function so we put parenthesis here you can Define parameters if you want but we don't put curly braces and we Define our logic here because we only care what about what needs to be done so we only care that each class needs to start the engine how it's going to start the engine it's up to each particular class so we go down here we type class and I'm going to create a class called car and it's going to have a a vowel name which is going to be a string and a vaal color which is also going to be a string and now to implement the interface we put colon and we type engine and as you can see we have this engine we have this eye for interface here so you press enter then we put curly braces to define the body of the class and now we have this underline here and this underline is here to tell us that we need to in now we need to implement the we need to implement this function because the the interface and the class have a contract is like a contract and the contract says that if you implement an interface you need to you must Implement you must override the the the function so you need to implement the function you still will this is why we have here here an underline so if I click on this underline what if I hover over there and I click on the light on the red bulb you see that it says Implement members so click on Implement and have our start engine function we click OK and now our functions was overrided here and we have this to do which is not yet implemented and this is there to to tell us that this method this function is not Yeti implemented so we need to define the actual logic here and let's create two other classes let's um call this class track and it's also going to have a name a Val going to be a string and the color also string and we're gonna also implement the interface so I'm going to put colon engine then we put curabase now we need to implement because I said there is a contact between the interface and the class and the contract says that you need to implement the function so we Implement a function here and we create another class call plane and it's also going to have a Val name it's going to be a string and the eval color also string and here we put colon and we're gonna also implement the interface interface inside the plane class and we put call on engine our interface then curly braces and now we have the underline because again we there is the contract now between the interface and the class and that says that we need to implement this function inside our plane class and we have those to do and those to do are here to tell us that we need to we need to imple we need to provide some logic to the to the actual function so let's delete those and let's put some code here so let's delete this and let's add the print line here which is gonna output some text to the console and we're gonna have the text the car you starting the engine and I'm gonna copy this because now I'm gonna put here some text I'm gonna say the track is starting the engine and here is going to say the plane starting the engine now what what we have done here and what we did here is that we know that each class respectively our car our tracking and our plane they all gonna start the engine so they all gonna share this start engine Behavior the one all all gonna have this functionality what we don't know is how each class how each how each object is gonna start the engine because they uh they start the engine in a different way the engine of of a car is different from an engine of a truck or form of Lane so we know that each each is gonna not that each class or each object is gonna start the engine but we don't know how they're gonna start the engine so here we go inside the actual uh feelings inside the the function which we type the text the car is starting the engine the truck is starting the engine and the plane is starting the engine so they differed in how they start the engine but you know that they all gonna they all gonna start the engine so this is what interfaces allows us to do you can define an interface if you know that uh multiple uh related or unrelated classes or objects are gonna have a function shared between them but you don't know how each particular class or object is gonna em is gonna uh how is gonna how it's gonna have the actual quad uh how it's gonna write the actual code for that uh that behavior so you don't you don't care about the how you want to care about the what so we know that in this case they will start the engine but they they start the engine in a different way and you can have here another class let's say that a person which creates another another class and the class is gonna be called Tesla and in that case again you can implement the interface because you know that uh the Tesla is also going to start the engine you don't know how it's going to start the engine but you know that uh is going to start the engine and how it's going to start the engine is specific to a Tesla car so this is what interfaces allow us to do we can Define uh some shared Behavior between unrelated or related classes and that the actual code you don't Define any code inside the interface you can put you actually can Define here a property but uh uh usually you just Define uh the the function the function name some parameters and the actual code goes inside the class which implements that interface let's let's actually create here a class Tesla so we put here let's put this a little bit up so we put here class Tesla is gonna have also a Val name it's going to be a string Naval color and this is also going to be a string so now we can Implement our engine interface so we don't know how Tesla is going to start the engine but we know that it's going to start the engine so we we Implement our interface put call on the name of the interface and now we need to implement the start engine so we click on that and we have not yet implemented let's put our print line here I'm going to press Ctrl V and here's gonna say that's like starting the engine so this is what interfaces are and see you in the next video because I'm going to end the video now so here you should say a Tesla is starting the engine not the Tesla so I collected that so I thought it's a good idea to show you a practical example using Android studio where interfaces are used because the when I first learned about interfaces and after classes I found them very confusing because they are very very abstract and you don't see when when you somebody teaches you those Concepts you don't see how where and where you're gonna use those uh those Concepts interfaces and Abstract classes and for that I'm going to open Android Studio to show you a practical example using interfaces and also organize Android Studio to show you a practical example where we're going to use abstract classes so I opened Android Studio you don't need to it looks similar to our IntelliJ because this IntelliJ IDEA just that is it's Android Studio so we will click on my application and here we have this thing called main activity we don't need to worry about this because as I said I just want to show you where interfaces are used in Android Studio to get to get an idea about where they are used because I said they are very abstract foreign this thing called activity.main This is where we put our UI this is where we put our buttons this is where we put our list views uh this is where we put generally our UI so as you can see we have two buttons here and they have an ID again I'm not gonna go into this but if you click here on design you see that we have a login button and a sign up button so this is the UI part of our app now I'm gonna click on this main activity and this is the part where you're gonna put our code and now I'm gonna link those UI buttons so let's go to quad so this is the code for creating those buttons and I'm gonna link those buttons because they have this ID here login button so you have here Android ID and if you come from Android Studio you already know all of this I'm gonna link those UI buttons with some objects buttons by typing some code so I'm gonna Define up here foreign called the login button and it's going to be of type button so this is a class button then I'm gonna Define another later need because I'm not gonna initialize it right there so Laten it again sign up button and it's gonna be also of type button so types like we have types for uh for our numbers or for our just that this is a class and this rep this class is a button objectives and now we need to link those those objects that we created here with those buttons that we have here those UI buttons so to link those login button and sign up button and to do that to go down here and I'm gonna I'm gonna go I'm gonna do this in the longer way and here we type login button again you don't need to understand all of this this is just to illustrate how interfaces work I'm gonna put equals and now I'm going to type find view by D and this function find view by ID is gonna link our button object that we created here with our UI button that we have that we have created here and it's going to be linked by its ID by this ID that we have here login button so if you go here hero Type R so R is this thing which uh again don't need to understand all of these arrays is used to to get that ID to link our button object with our button UI so if you put r dot ID that and we have our uh our two IDs so we choose login button so now we have linked our UI button with our button object so we linked the UI in other words with the code now let's link also the setting up button so we type here saying a button equals find view by ID you you also type r dot ID Dot sign up button again you don't need to type this code because probably you don't even have Android Studio this is just to illustrate something now to illustrate how interfaces work let's say that I want to let's say that I want to to do something when this login button is clicked and I want to do also something when design up button is clicked and it and here interface is coming to action what you can do is you can say login button Dot and there is a function called set on click listener and this function what is doing is basically setting a listener on our UI button so that when you click on that button the function called on click is going to be executed and the code that is going to be in that function is particular to each to each button so you you you're gonna set the interface so you types don't click listener and hero type also this illustrates uh the object also this by by this example we also illustrate how the Anonymous classes work so you type object and now I'm gonna inherit actually gonna Implement our interface on click listener and this only listener interface has a function called on click and here to put curly braces and press enter and now here we have this underline and if you click on it you have this red bulb because it wants us to implement to implement that on click function so we're going to implement that and it says to do not get implemented I'm not going to do the same thing for the for the sign up button so I'm gonna copy this I'm gonna paste it down here and I'm going to change this to sign up button so now each individual each individual button has us on has its own on click listener interface and the code which is going to be executed inside the one click method because this function is going to be triggered when you click on the button is particular to each button so this button is going to log in the user this button you're gonna put here the code to sign up the user but you're not going to do that we're just gonna we're gonna uh show some text on our emulator so we type here to show the text toast dot make text here you need to pass the context so don't worry about all of this main.activity here you need to pass uh how how long this is gonna show on the screen so we choose a short and we put that show to show this on the actually here we need to pass the text so what text is going to be shown on the screen so here we're gonna say login button clicked and now here we need to pass how long it's going to slow so you type those Dot short so if it's going to be shown for a short time and then we need to call the show functions to show this on the screen and I'm going to press Ctrl uh C to copy this and I'm gonna paste inside our on click function in our interface that we have here for the sign up button and this is gonna say that sign up button was click so sign up button clicked now in Android Studio we have what is called an emulator and this is basically a virtual phone and we can run you can run our code and we can test our code and we're gonna see when on that emulator those buttons and when you're going to click on those buttons this code that we Define here for for those buttons because we linked them so we linked those two buttons that have the login button the sign up button so this is their UI code this is their XML code you we've linked them through code here and when we click on them the Code in each particular object is going to be executed so now if you run our code go up here and I'm gonna create now the virtual font to see our buttons and I'm going to click on them to see how it works I'm going to close those now it's connecting to the emulator and this is our virtual virtual phone so this is the virtual phones and here we have our UI that we created here so this is what the users see so this the what the user say and this is what we see it's the this is what happens under the covers and now if I click on this login button look what happens it says login button click so it executes this on click function inside the login button if I click on the sign up button it says sign up button click because it's executing the one click function and the code inside the one click function for the sign up button and they are as I said linked by the by the ID so this is what happens under the covers this is what the user see now this is where interfaces can be used because if you think about you can have multiple uis different uis text views lists or items into the items in a list which can be clicked and for all of those you know that always go all of them are gonna have on click function all all all have this shared functionality to respond to a click you don't know how that is gonna how that that one click function is gonna execute or what code that on click function is going to have for each particular UI uh UI but you know that each each one is gonna have one click function what is going to go inside the one click function for you for each particular UI it's up to that specific UI so it's up to a button it's up to a text views and so on so this is a over interfaces are used because we know that they're going to have a shared functionality of one click but you don't know how that functionality is going to be implemented by each particular uis in our case we do we know that login button and sign up button both both are going to have a one click both we're gonna are gonna respond to click events but you don't know what they're gonna do so this is why you define the interface and the developers who write code gonna Implement that interface and you're gonna write the actual implementation for that function which is specific to that object so this is our discussion and if you find this confusing particularly if I'm confusing the uh if because I touch a little bit on Android Studio in our discussion don't be because I just wanted to show you a practical example where interfaces are used using Android studio so let's click again on login button we get our toast login button clicked slang a button click I can create another button which can be used for a I don't know if you forgot the password and you you're gonna implement the on click listener you're gonna override the you're gonna override the one click function I'm gonna write some code to to send uh to send to help help the user to recover its uh puzzle and so on so we can see how interfaces can be used practically in this with this example so this is our discussion see you in the next video so now it's time to start a discussion about object expression but first let's go down here and let's create a class to see why you'll need to use object expression in the first place so you type here class and now and our class is going to be called button we put the parenthesis to create the primary Constructor we Define some properties here the first one is going to be text is going to be of type string the second one is going to be also available it's going to be called ID it's gonna be an integer and the last one is going to be called One Click listener it's going to be of type on click listener so this is an interface that we're gonna create so let's go down here to create the interface we type interface on and while I'm jumping you see that you have this suggestion one click listener to create the interface press enter put curly braces and let's define a function fun on click let's put parenthesis now let's create some objects with our class button to see why you'll need to use a object expression in the first place so let's go here and here we type Val let's call it login button put equal and now let's create our object type button with parenthesis now let's pass some values to the properties of the primary Constructor and this is gonna have the text to login for the ID we type some arbitrary numbers here one two one three two and um now here you need to pass the one click listener interface but do not we cannot type here one click listener because we cannot instantiate the interface so what can we do to solve this problem one solution to this would be to create a separate class here let's put it actually above the interface let's call it click listener this class class click listener and this class is going to implement the interface so we put here colon and we call our on click listener interface put curly braces and now we need to implement that one click method that one click function that we defined actually inside our own click listen interface so press ok to override to add on click function and we have that to do we have this to do which says to do not yet implemented so this is there to tell us that it's not implemented yet so let's delete this all right so what we could do is you can create here an instance of the click listener so we type here Val click listener equals create the instance we'll create an object and now you can pass here the click listener so now the arrow disappeared but if I create a second object let's call it the sign up button equals button let's pause the text so sign up for the ID was an arbitrary number now in our imaginary or example that we have here actually if you think for real scenario with this button and the one click listen what we want to achieve here is that if you have a graphical user interface you want that you want to detect that click so you want to declare detect one that specific button let's see that this button object that we have here is linked to an uh graphical button which on which you click because they are linked when you click on that you want to call that one click function that is defined inside our interface inside here but you want to make that one click interface we want you want to make that one click function particular to particular to that button which was clicked so we we want to to implement that uh one click function to that particular button which was clicked and the code that goes inside that particular button so let's say that you click on the login button it's particular to that button so that in the next when the next button is clicked so when if the user clicks for when the sign up button then you know you need to also have the one click method called but that one click that one click function actually I I keep saying method but the one click function should should have its own implementation a particular to the sign up button so what can we do in that case we cannot pass the same instance here to click listener because even if it creates here another instance of the click listener it will still have the same code which is here so if you put here some code this is code blue it will be shared among all the objects that are created so what you can do in this case is to use an object expression or also called anonymous anonymous anonymous classes so what you can do here we can type object we put colon and now we are inheriting from our we are actually implementing our own click listener interface so we type object colon on click listener and we put curly braces because here we declare and we also instantiate the the anonymous class so we need to implement that right there so by doing this now we where we made the one click function particular to each object Which object button so we can do the same thing here we type object and we Implement our on click listener interface we put curly braces now we need to implement for this particular object for the sign up or button objects we need to implement that function so if we type we click we click on this object we go to the red light bulb and we type we press here where it says Implement members so implement the one click function and now what we did here is we made the one click function particular to each object so each object now we can put here some code code or we can type here this sign in actually let's type login that was it so now we can have code here which actually log logs in if you have a real graphical user interface which logs logs in the user and here you can also code to sign up the user when that specific button is clicked so by doing by using the object expression also called Anonymous class because you don't have reference you don't have a name for the class here you just it's just Anonymous for this is anonymous so we cannot it does not have a name so we cannot call it later or do something because it's created and also instantiating right there this is why I need to implement the one click function and now we made the one click function particular to each button and you have more objects more objects of created with the class button they'll have their own implementation of the one click function which comes from the interface on click listener so this is why you need to use the anonymous class or also called object expression and it's an expression because the value that the because the object is always it's created and instantiate it is actually declared and instantiated at the same time it's also assigned to the property that we Define here so this is why it's called an expression so see you in the next video all right so now it's time to start a discussion about delegation but first I'm going to add the main function here now what is delegation delegation means giving power given Authority from one instance from one class to another class and delegation is usually used in in scenarios where inheritance starts to break so when inheritance starts to break when you want let's say it for whatever reason to inherit from two classes in that case you can't use inheritance because with inheritance you can you inherit just from only one class but with delegation you can plug in multiple implementation of classes in your own class and let's see how we can do that so I'm going to create first an interface called a and it's going to have a function called print then I'm going to create another interface called B and it's going to have a function print though then I'm going to create a class so I'm going to type here class and it's going to be called first delegate and it's going to implement the fun the interface a here and I'm gonna press Ctrl o to override the function print here and I'm going to create another class called second delegate and this is going to implement the interface B so I'm going to place Ctrl to override the function print tool now I'm going to create up here a class called up so class up now let's say that I want here to inherit from the first delegate and from the second regulator so I'm going to inform the single delegate and if I type here first delegate I put parenthesis opening parentheses closing parentheses if I put curly braces now I have another line because I should Mark this as open so mark this as open and also this as open because I want to show you that so now if I want to inherit from the second class called from the second delegate because let's say that I want to use the the print to function in my class for whatever reason I can't because I can't only inherit from one class so if I hover over here over this underline it says only only one class may appear in a super type list so in other words saying that you can only inherit from one class and that is all we cannot inherit from multiple classes now with delegation we can plug in multiple implementations in our own class so what I can do here I can say hey implement the interface a so I'm going to inherit it from the interface a but you're gonna say use for the interface a the implementation of the first delegate class so this is what we're saying here a and the keyword by first delegate we're saying hey use for the interface a the implementation which is provided by the first delegate class and that will work then I'm going to put a comma here and I'm going to say use also for the class B so I'm going to type for the interface B so we're gonna type B and we're gonna use the by key you're also going to type here by second delegate so you're saying use for the interface B the second delegate implementation and it's gonna use that and it's gonna be him happy with that so you're gonna see that we get no error and now I can override here both the print function and also the print to function so if I press Ctrl o now I can override also the print too and this is inherently very powerful because we can plug in here multiple as many implementations as you want in your class so this is in the if you think about in contrast with the inheritance this is very powerful because here you can plug in as many implementations as you want and this is very powerful so this is how you can use the delegation in kotlin and next we're going to see how you can use delegation with properties so to use delegation on properties first I'm going to paste some code here so I'm going to paste this code here and what we are having here is a class format delegate which is inheriting from the read and write property and it's overriding the get value and the set value so we are overriding the setter and the getter inside our class and we provide our own implementation so whenever you you use the setter to set a value or to get as a get a value we we are overriding those functions and we provide our own implementation next I'm going to create here up here a class but first I'm going to delete the code and the interface that we have here because we don't need this code so I'm gonna delete this code and I'm going to create another class and this class is going to be called user I'm going to put curly braces and I'm going to define the properties inside the class so I'm going to type here VAR first name so what we are doing now is we're creating a property first it's called first name and I'm going to use the by queue we're just going to say buy format delegate so what we are saying now is use the use the the we use the code which is inside the format delegate Whenever you set the value or get the value of the first name I'm going to put the parenthesis here next I'm going to type another VAR last name and I'm going to type here again bye and I'm going to type format delegate so format delegate and we put parentheses so not now what is going to happen is that whenever you set the first name properly or we get the name the first name property is going to use our implementation that we provided here this is what you're gonna do and the same it will be true for the last name because we are using the delegation here on properties so I'm going to create here a user so I'm going to type here Val user want to type equals to user and I'm gonna type here with I'm gonna type user this is the scope function I'm going to put curly curly braces and I'm going to type here first name equals Alex and the last name equals uh dominga now if I output those values in the console look what happens so if I tap it here print line user that first name and print line let's actually use again with the scope function type here with just pass here user curly braces print line first name and print line last name now if you run this code you're gonna see that it's using the overriding functions that we provide in our format delegate so we have in uppercase letters like we defined here we're gonna wanna whenever we set about is going to be set it with the it's going to change the value to lowercase letter so get Alex and obinka in lowercase letters so this is how you can use the delegation on properties and see you in the next video so now it's time to start a discussion about collections but first i'm going to create a new project I'm going to call it collections for the language select link for the build system IntelliJ make sure to have the jdk selected and also check this box to have the main function Auto generated for us so I'm going to click on create to create the project now I'm going to delete this code because you don't need this code and also I'm going to hide the project pane now what are collections collections are a group of objects stored together in a single variable they are similar to array but there are there are different in some sense and they are mainly three collections that we're gonna look at and this those are the list the set and the map and the and those among those collections they are separated in two groups so there are multiple multiple lists and set air maps and immutable lists set and map and in the motable means that you can write to that collection so you can add or or remove elements to it so the that collection can grow or Shrink as you add or remove elements to it and immutable means that you can only add elements when it when you instantiate that or we're going to create that collection you cannot add later elements to it the size is fixed so we cannot add or remove element so this is the difference between immutable and multiple and we're gonna look at all of those in this video so we're gonna look at the list collection first and we're gonna look at an immutable list so we type Val I'm going to create a variable names and here we're gonna type to create an immutable list type list of and here we need to specify the type what kind of data I'm going to put here and do type name one name two and name three now we cannot add or remove elements from this list because it's an immutable list but we can get on Elemental output in the console and to do that to type it in the line we type names we put square brackets and we get the element by its index and the index also starts at zero so let's get the first element so if you're on this code you'll see name one I'll put it in a new console so you get name one so this is an immutable list we cannot add or remove elements from it after we instantiate it here what now now let's look at an mutably so a list which can within which you can add and remove elements to it so to do that we just change this from a list of to a mutable list of so we type here multiple list of we can also remove the explicit type here the explicit type declaration because it's gray out so remove that because it can be inferred and to this mutable list now we can add or remove the elements so I can type here names and we have this add function so you can type add and here we can you can pass a new element so we pass here let's say name 4. now if I uh let's type here names that for each print line not in this footage name start for each this for each opening the line now if you run this now you see you have name one name two name three and name four so name four was added to our Multiple List because our list is multiple we can add or remove new elements so down here I can I can type names dot remove and we can remove an element and we can remove the element I think by you can remove you can use this function remove art so we can remove the element by its index so we can type here the index and that is going to remove the first element so if you run this code name one is not going to be showed so as you can see name one was removed because you can you will remove it by its index and we can also remove an element using this function by typing uh the elements so we type here let's say name two name two elements and now it's going to be removed so now if you run this name two was removed so those are two functions with which you can remove elements from the Multiple List so this is a multiple list you can add and remove elements to it and the list is gonna grow and Shrink as you add or remove elements to it so this is the Multiple List now we're gonna look at a set and I set this a collection which can store only unique unique elements so you cannot have duplicates so if I delete this so in our in our Multiple List you can put an element which is the same so we can have two elements which are the same so if you run this we have two elements which are the same going to see name one at the end I have name one name two name three and name one again so you can have uh duplicates in our collection on our multiple list but in a set you can't so but first we're gonna look at uh first we're gonna look at the immutable set and then add automotive ball set so we type here uh let's delete this we type here set off and here you need to buy string now if you run this you will see that name one is not shown two times here it's going to be shown only one time so you have name one name two and name three this is because the set Seto the set is not allowing duplicates in its uh in its list so and this is a new multiple set set off so if I type here names dot add we cannot add or remove new elements but you can also use a multiple set of so we type here Moto motable set off and now we can add and remove new elements so you can type names that add so here you can add a new element let's say name so now if you run this I'm going to name one name two name three name four and our duplicate is not strong because I said a set can only can only store unique elements not duplicates but if I add objects that we create look what happens so let's create some user objects but first let's create the class user and it's gonna have a Val name is going to be of type string no let's create some user objects here and we're gonna add to our multiple set so we type here wall user one I'm gonna type here user I'm going to pass some generic names like name one and let's control the a few times let's change this to name two five and let's add here a Val user six equals user and let's type here Alex let's press Ctrl d and let's change this to user 7. now let's add those to our multiple cells so let's change now the type so it's gonna store user objects so we're gonna pass here user one I'm going to speed up now this a little bit I'm gonna press Ctrl tilde format the code now we can add this we cannot add here a name for because now the type is user now if you're on this let's actually change this print to it dot name and let's let's run our code now and we have name one name two name three name four Nerf name five and have Alex two times so why you have duplicates even though I said that sets can only store unique elements this is because previously the set actually what is doing to determine to if to if it has duplicates is using the equals to function that we talked about in our video about data classes so when we typed only strings then it was using the equals to function which was overridden inside the string class to determine if there are uh if there are equal strings but now because our class doesn't have the equals to function over it then it's in its class it's not it's using the equals to function which is inside the ending class so you cannot determine if two users are are equal and to change that just let's hide the console and just put the data keyword here because now this will generate the equals to function the the the two string and the harsh code so now if you run this now we have Alex only one time because now it's using the equals to function which was uh Auto generated by by uh by the class user because you put here the data key or so this is a good thing to have in mind that this model set is using the equals to function to determine if the object that you add to to yourself are equal so having this in mind now let's look at Maps so I'm going to close this I'm gonna delete this let's delete this let's delete this also now let's look at the next collection that you can use in kotlin and that is the map collection and use collection when you want to store key value pairs so I'm going to create a variable it's going to be called users and I'm going to put equals and I'm going to create first animated bottom up so we type map off map of and here you need to specify what kind of type is going to be the key so the key is going to be an integer but you can put any class you want here and the value is going to be a string so I'm going to store the ID and the name of an user and to Define our element in pairs here we type first the key and then we use the to keyword to map our kit to its element so 2 is value actually so type 1 2 and now the value let's first type Maria so now we have one element stored in paired and the key is one the value is Maria next I'm gonna do the same for the next one so I'm gonna type here two two the keyword tool Alex and then I'm gonna type three the keyword tool so inside you need to type the value now now type John now to get one element from this map with I print line we type here users square brackets and we type we get the element by its key as you can see by this hint key so we get let's say the element one so now if you run this code we get Maria because Maria has because this key code is for the for the key one the value mapped the value which is corresponding to this key is Maria and if you change this to two gonna get Alex if you run this so this is an immutable map in this map you cannot add or remove elements but if I declare this as a multiple map so let's change this to a multiple map so we type here mutable map off let's delete this from here and let's pass here and and string now here now so you need to put this in parenthesis here we can add new elements so we can type users actually first let's Loop through our mob to see our elements and I'm going to use the for each function to Loop so we type here users dot for each and we choose this one and inside our Rook without we are the print line and I'm going to put quotation marks and here we're going to put dollar sign I'm going to type T and T is the key and dollar sign U and U is the value so now if you're on this you get one and Maria to and Alex Three Angels so we have the key and we have the corresponding values and you cannot have duplicated keys and this is very important to know you can also add or remove elements from this map so to add an element you just type users and we need to specify the key so we put square brackets so we type user square brackets and then put a key let's say five and we put here equals to and here we need to pass a value so the value is going to be let's say Vlog now if you run this we get one and Maria two and Alex three and John N5 and the corresponding value Vlad so Vlad has the Kiwi the key value five so you can also remove an element from our map so we type users dot remove you know you you here for this remove function you pass the key of the of the element that you want to be removed and let's say that I remove two so I remove Alex from our map so if I run this quad now Alex you know it's not going to be shown here because it was removed on the line for so Alex was removed so this is how you can use the immutable and multiple Maps this is how you can add and remove elements and this is how you can Loop through our map and this is our discussion about Collections and see you in the next video now it's time to start a discussion about collections operations and we're going to look at the first operation and that is Transformations and we're going to start with the first one called mapping so I'm going to create a new project I'm going to call it collections operations IntelliJ then click on create we go on the left hand side click on kotlin right click new I'm going to create a new file I'm going to call it Main I'm going to create the main function now what are transformations as the name implies Transformations are some functions which which you can change a specific collection and we're going to look at the first one which is called mapping so I'm going to create first a collection so I'm going to type Val numbers and it's going to be a set so I'm going to type numbers you're gonna equals to set off and here we're gonna Define some values like one two three four five let's press Ctrl alt format the code now I'm gonna add the print line here now to use the mapping collection transformation we just type numbers and one important thing to know here is that those transformation functions are Lambda functions so if you don't know what Lambda functions are I suggest you to watch the section which is called Lambda function to First understand what our Lambda functions because it will be it will be very hard for you to understand how this how those Transformations work without understanding how Lambda functions work now here we're gonna call our our transformation function which is the first one which as I said is mapping and the function is called map I'm going to explain immediately what it's doing and as you can see it's a Lambda function so we're going to press enter and we we are inside the curly braces and here we're gonna Define our transformation so what we are saying basically here is do whatever I I type here in this those uh curly braces apply to every element of the of this cell of this collection so if I if uh now to refer to to refer to the parameter uh uh to the specific parameter from the numbers uh uh set we type it and I'm gonna type it times 10. so what we are saying here is do this transformation so change this uh change this uh this set by uh more multiplying every element inside the this uh this collection inside this set by 10. so if you run this now every number is going to be multiplied by 10. so if I run this now we get instead of one two three four and five we get 10 20 30 45 so what this map function and what this uh it times 10 did is is it transformed it changed our set into into what it it was changed by the expression that we defined here so we said that I want every element we said here to be multiplied by 10 and then we display them here we can go even further we can put here an if statement so we can type here if let's say it so it refers to the to a specific element in that list in that set so if it equals equals so if equals three I'm gonna say we're gonna say here it times 100. so what we're saying here if one of those elements inside these numbers set is equal to 3 then multiply it change it so change it by by the by this expression so multiply it by 100 and you can also put the else part so we put else you want to put it times so if the else part is true if the else part is executed we're saying if the number is not equal to 3 from this list then multiply the number multiply the number by uh by 10. so now if I run this look what we have here so we have 10 20 and we have 300 here this is because this transformation now is using the if and else statements that you define here so this is what the map Transformations allows you to do you can change you can transform a specific collection by an expression that we defined inside the curly braces of the map function all right now let's look at how we can can use the map transformation to with another collection unless you'll see how can you can use the map transformation with a map so with uh with the with the map which has a key and a value so to do that we just type here Val numbers map so I'm going to type file numbers equals I'm going to type map off and here I'm gonna type key one two one then key tool two two then key three two three and finally key for two four now if you wanna use the map map transfer transformation function on the map map collection you you you can use it either on the keys so you can use it on the keys or on the values so we can type here print line number map number map so we choose here Dot and we choose map Keys now so choose this one map key Lambda expression so map keys that one and here to type eat dot key so get the key Dot uppercase so that is going to upper case all the keys inside our map then I'm gonna add an another print line here I'm gonna type number map Dot map now choose map values and we type here it dot value so the Value Plus it dot key dot length now if you run this though this expression is going to be applied to all of our keys inside our numbers map that we Define above and the second transformation is going to be applied to all the values that we defined inside our numbers map so if you run this code now I'm going to see the the keys being first uppercase and then we're going to see the keys plus plus the length so you see first I get 10 20 300 for 40 and 50 for our first transformation that we have here then we have our second then we have our transformation on the map on the map keys so we have we have the key and then we have the value we have he and the the key is uppercase because we said uh to to do that by using this expression it so it uppercase all the keys as you can see here and then you see the corresponding value for the key after that you see you have numbers map map that value so you have it that Value Plus e dot key dot length so we have key and I have one and we have six we have key two and half seven so the key the value of the key is uh is uh to the value of the key it's added the length of the so to the value that we have here we we have added the the value length of the string key that we defined here so this way I have uh we have uh two then we have seven then we have eight and then we have nine so this is our and you can also you can also do for the uh map for the map transformation and we type here numbers Dot map and we choose this one index not node and here we choose we have two parameters first is the index and second is the value so I'm gonna choose the name for the first one index and for the second one let's call it uh value then you have the auto and here we have we're going to Define our transformation of our expression which is going to be applied on our numbers so here I can use the index so again I'm going to type here an effects if a statement so if index equals equals zero then I'm gonna assign so I'm going to transform to the to that we're going to put the value null to the index 0 else I'm gonna type index times value so else you're gonna uh multiply the index time times the value so if you run this we get 2 6 12 and 20. so for for the first one we get nothing because we for the first index we signed null and then uh it's using the else part to to transform our numbers list and it's multiplying the index by the value so we we first uh we first have this indexed uh zero multiply the here we have null for this because we checked here so we have not so at the index two we have one times two and uh we have two then here we have add indexed two we have two times three so the index is two the value is three and uh we we get uh we get six here and so on so this is how we can use also the index if you want in your transformation now we're going to look at the next transformation that you can do in our collection and that is zipping now it's time to look at the transformation function called zipping so I'm going to add a comment here called the zipping and I'm going to declared to list I'm gonna call the first one colors no particles I'm gonna type please stop I'm gonna type red Brown and Gray and I'm going to create another list called the animals stuff I'm gonna type here Fox beer quotation marks and uh wolf now what does the zipping or the zip functions allow us to do is to create pairs of elements with the same position in both collections so we can create pairs with red we can create a pair of fox and red a pair of bear and brown and a pair of wolf and gray and you can do that just by typing here print line and we have you can do this in two ways to type colors and you can type Dot dot zip and you type here animals and if you run this you'll see them in pairs so you're gonna see Fox thread bear brown and so on so you see here red fox brown bear gray also the zip and the zipping is used to create Pairs and the pairs are at the same position in both on both collections or if you don't want to use this Z function with parenthesis you can type here colors zip and animals and type here any models now if you run this code you're going to see the same output now if you want to use a transformation with the Z function you can type here print line you can type colors dot zip and I'm going to use the parenthesis animals and animals and now I'm going to put curly braces so the Lambda function here I'm going to type animal for a let's put for scholar and animal I'm gonna put the arrow sign and here I'm gonna type day I'm gonna but I'm gonna put first quotation marks and quite the and I'm gonna put dollar sign and we're going to refer our animal uh parameter that we defined here so we type here there animal Dot and we call the replace first chart function so type replace first chart and as you can see this also has uh I think along the function and inside of this we type it dot uppercase uppercase and this is gonna uppercase the first letter of the animal uh with the animal that is defined here and I'm going to type yes dollar sign color right now if you run this you're gonna see the force and the f is uppercase because it's uppercase by this expression that we have here it replaces and this it refers to the animal uh an animal uh variable animal variable that is defined here and it refers to the first letter so it says eat that uppercase so uppercase the first letter then uh then uh return that to the to the animal uh any more variable and we have the fox is red so I have the color and then we have the bear is brown the wolf is gray and all the animals start the capital letter like we Define here in this in this expression so this is the zip function so this is how you can use the Z function to create Pairs and also you can use the unzip function to unzip a list of pairs so first let's create a list of pairs so I'm going to type Val number pairs equals I'm gonna type list of and here we're going to put one two one two two three two three four two four now if you want to unzip those pairs that we created you can just type here print line number pairs let's first display them as pairs and the necklace print line and so let's type number pairs dot unzip now if you run this you're gonna see them first in pairs and then you're gonna see them unpaired because we use here the anzi function so as you can see here you have first one and you have one two two three three four four so you have in pairs first and then we have them separated so we have first one two three four and then we have the numbers one two three four so did you we unzip them we separated them they're not pairs now anymore with this unzip function this so this is how you can use the NZ function now it's time to look at the next transformation that we can use and that is Association now what is association association Transformations allows you to build maps from The Collection elements and certain values associated with them and different Association types the elements can be either keys or values in the association map I'm going to see what this means and the basic Association function is the association associated with which creates a mob on which the elements of the original collection are keys and the values are produced from them by the given transformation function so let's see an example with uh with this so I'm going to delete this code because it will make a doubt but hard to understand we could have so many things here and I'm going to type Val numbers you know put equals I'm gonna type really stuff nanotype here one two three and four now I'm going to type here print line numbers and we are going to use the association associate with the function so we type associated with and this is going to produce as I said previously it's going to produce a map in which the elements of the original collection are keys so the keys of this map are going to be those elements and the values are going to maybe are going to be produced by what expression we Define here inside the parenthesis so I'm going to Define here it so I'm going to type it dot length so now if you run this you're gonna see the keys being one and then I'm gonna see the value being the length of that specific element so if you run this we get the key one the value three the key two the value three then you get three the value is five then you get four and the value is four so what has happened now is that the associate with function created the map in which the elements the key the key are the elements of the collections so those are the keys inside our map and the values of uh those uh with the association with the associated with those keys are produced by the expression that we Define here by its dot length so basically gonna use the length of that specific element and it's going to be the value so this is why I have one three two three three five and so on now for building maps with collection elements as values there is a function called associate by it takes a function that returns a key based on an element's value and if two elements keys are equal only that last one remains in the map so let's look at this one so I'm going to type here print line I'm going to put here numbers so we type numbers dot associate by and now here going to define the expression which is going to build the key because now the the associate by function is going to build a correlation which the elements now are not Keys like we had previously but they are values so here in the expression need now to Define how the key for those respective values that we have here is going to be created so we type here it DOT first dot uppercase so this is what what is this is gonna do it's gonna create a key it's gonna use one let's say that we have element one and it's gonna take your element one it's gonna take the first letter of the element one and it's gonna uppercase it and you're gonna have o and as the key we're gonna have o and as the value we're gonna have one and uh for the next ones uh it will be the same so now if I run this quad foreign elements are the values here so they are the values previously The Collection elements what the key is and the the keys were builded by the expression that we defined here by this so we have o and we have t and we have four and we we have uh t uh only one time and we don't have two entry because uh you cannot have duplicated keys in a map so this is why you only have one only one t here so uh this is associated so this is Association now associate by can also be called with a value transformation function and to do to do that you just type here print line numbers that associate by now we need to apply a transformation now on the key and on the value and how gonna how gonna do that we can type here actually let's delete this because we don't need curly braces we put parentheses and we type here key and we have a suggestion key selector so we're gonna apply the First Transformation on the key so we type key selector that named argument and we put curly braces and here we type it so the key DOT first dot uppercase so now what we're saying here apply this transformation for every key in in in the map that is going to be built so apply this transformation for every key that is in the map that is going to be built so we're saying to uppercase uh to take the first letter and uppercase it then we also need to apply transformation for the value we put comma here at the end of our curly brace and we type here value you also have a name argument you put again curly braces and here we're gonna type it dot length so this is the transformation that is going to be applied to all the values in the map that is going to be built so this is the transformation so this is how all the keys and the the in the map that is going to be built are gonna be uh change so the first letter is going to take this thing is going to take the first letter of the keys and it's going to uppercase it this will uh we'll take the length of the the all the values in the in the the in the in the map that is going to be built and it's gonna display the the length of that element so if you run this we get 0 3 T 5 F4 so we have the first letter uppercase and then we have the length three then we have t we have the letter upper case and we have the value five the length of that uh uh element then we have F so we have a four and we have the the the transformation apply on that element on this element on on four and we have the length and we have four so this is how we can use transformation Transformations with the associate by function and the next we're going to look at the next transformation fact function and that is flattened now it's time to look at the next transformation function that you can use and that is the flattened function but first let's see why you'll need to use this flattened function in the first place so I'm gonna add the comment here called flatten and I'm going to create a variable here so I'm going to die Val it's going to be called numbers sets and this is going to be a list with list so I'm gonna type here list of and inside the list I'm gonna Pro I'm gonna type set off so we have a list inside the inside of our list and I'm going to provide some values to our set of like one two three then another set of four five and six then another set of seven eight and nine so what we are having now is we have a list within a list where the index of this list is it's its own list so we have a list of sets of ins now if you want to Loop through this list if you want to display the elements in this list uh it is not that easy because you will first need to Loop because let's say that because what we have here is what is called a multi-dimensional array so more specifically what we have here is a two-dimensional array and at the index 0 we have a list at the index one we have another list and at the index two we have another list and to navigate to this list we need to first get inside that list that is at that other specific index to Loop to that list and then we need to move to the next index and to to look to that list to that next list which is that index but now let's see first how we can access one individual element from our two-dimensional array so from our array of arrays and to do that to type here print line gonna put numbers set and if we we put square brackets and we Define the index from uh which from which list we want to access the element and now I want to access the element nine and the element 9 is stored at the index two so we put two and let's say that I want and I want to access as I said the the element 9 now to access the element line I need to go within this list and use the index to get the element I and element 9 is stored at the index two so I'm going to put square brackets two but this for whatever reason doesn't work with a list of sets and we need to change this to array of array of also those also change it to array of array of also array of an hour everything will work fine so array of so if you run this so now we are accessing the index tool where the array is stored where our number is stored and we get the element two we get element nine so now if I run this we're gonna see nine autopilot in the console so we get nine so this is how you can access one individual element from our multi-dimensional array so I'm going to delete this I'm going to change it back to to a list of and to set off so let's type a list of set off set off and set off and now let's see how we can Loop through this type to the dimensional array and to do that to type here four and type numbers I type specific numbers because this is gonna as as you can see um gonna hold on hold the numbers the set of numbers four numbers in number sets so now you we are you we are getting the as you can see here this is of type is the the type set of ins so this uh basically gets the element of the number set index let's say zero and it gets the first set and now we need to Loop through that set so another four number in numbers so now we are looping through the list through the set which is inside the list of the index zero I didn't zero and you can add the print line to add to do output that number I'm going to type here number and also I'm gonna add the space here so I'm gonna add the print line here and I'm gonna type here four or slash n now if you run this as you can see you have on the output one two three then we have a space four five seven six then seven eight and nine but uh we achieved this by using a loop and then we use another loop so we have a loop inside the loop we have a nested Loop in order to get to the to this uh two dimensional array because as I said the in the index of this array is its own list so it contains the list now with the flattened uh with the flattened function what you can do is that we can convert this two-dimensional array in one dimensional array so you don't need to use this nested for Loops in order to Loop through to them it will return the nested the nested uh is it to private it will provide access to the nasty collection elements without you needing to Loop through this two-dimensional Ray it will it will basically take that two-dimensional array and it will convert it in one dimensionally and you will not need to create to have this nested Loop inside you have to have this Loop inside the loop in order to to display the number so to do that to type here uh Val numbers let's say flatten equals to number sales so our our list to it list that flatten now if you look at the type here now this is a list of fins you no longer have a list of sets of ins so this is a very very uh informative because it tells us that this now is just simply a list of ins is not a list with the set which is which is uh which itself is also or a list of events so this converts that two-dimensional array in one dimensional array and because of that now it's much easier to get one element from our list because now our list is not a two-dimensional array and it's just one dimensional array so if I type here print line and the let's say that I want to get the element nine I'm going to type here uh numbers flatten square brackets and I'm going to type here eight because it's stored at the index 8. so now if I run this so we get 9 here and as you can see this is much easier than uh with the the two that dimensional array so this is what the flattening function is doing is converting the the two dimensional array or if a multi-dimensional array in into one dimensional array so now let's look how we can Loop through our uh one dimension array so let's delete this and if you want to to Loop through this you just type 4 number in numbers flatten and we either here a print line number and let's comment this code and if you run this code now get the number displayed one after another so get one two three four five six seven nine and we got this because our function our flattened function our transformation function is transforming it's converting our two-dimensional array in one dimensional array so it's easier for us to get the elements into loop loop through them so this is what the flatten function is doing and next we're going to look at the string representation and the functions that you can use uh what we for the for the string representation I'm going to close the console now it's time to start a discussion about string representation so if you need to retrieve the collection content in a readable format you can use functions that transform the collections to Strings and there are two functions to do that the join to string and the join two The Joint to string build a single string from the Collision elements based on the provided arguments the join 2 does the same but appends the result of the given appendable object and what that means is that it's gonna add the text to the object on which that function The Joint function is called you're going to see an example with this immediately and now I'm going to create a variable called numbers while numbers I'm going to put equals I'm going to call it actually numbers strings equal and I'm gonna type here list off and I'm gonna put here the text one two three and four now if you want to retrieve the this if you want to get the string representation of this list if you just type here print line and type you put your numbers strings and if you run this we get one two three and four but this I I think is calling the two string function it's not because we're not using the joint to string function and I don't like those square brackets I want them to be separated by comma with spaces to get the to get data just type here print line so let's put here print line and to type numbers to string Dot joint to string and uh we don't we delete this and put parenthesis now you throw on this you'll see now the single presentation of our list they are going to be separated by comma when we do is going to have a it's going to have spaces now let's look at the Joint 2 function and for that I'm gonna Define another list down here so I'm going to type here let's press Ctrl alt for model code so I'm going to type here uh Val is going to be called list string and now I'm going to use something called a string buffer and this is like the string type is a little bit different but it's gonna allow us to do is going to allow us to present how the joint function over so string buffer and we put parenthesis and here we Define our text and we're gonna type the list of numbers I'm going to put colon so the type here the list of numbers colon now to use the join 2 function just type here another print line we we type number string number strings dot join tool and as you can see this receives a buffer and this is the buffer that we have created here so I'm gonna press enter and we're going to type I'm gonna give us the argument the listing that we created and what is this this is gonna do is gonna append this text that we have here in front of all of our elements that we have in our list number strings so now if you run the squad as you can see it added the text the list of numbers that we have here to our number strings in front so we have the list of numbers one two three and four now if you want to build the custom string representation you can specify its parameters in a function arguments which are the separator prefix and postfix and the result will start with the prefix and end with the with the postfix and the separator will come will come after each element except the last so let's see how we can do that so um I'm gonna use I'm going to use the number numbers to string so I'm going to type here print line numbers to string and we type join join to string and we select this one with the you select this one with the which with the separator parameter and the type is separator so now we Define the what is going to be the S the separator here and we're gonna put quotation marks and we're going to put this so this is going to be our separator between our elements next we're going to define the prefix so we put we put here comma type prefix and now I'm going to put the prefix and the prefix is going to be the text start and colon so I put quotation marks start and colon and we also need to provide the post fix and to do that we put another comma here so those are named the arguments which are defined in this files and join the string so we type here postfix and we put colon and now if you run this you're going to see them separated by this separator that we Define here is going to have the prefix start and it's going to have at the end this post fix which is comma and N so now if you run this quad as you can see we have start and we have one then it's separated by the sign that we defined here then we have 2 3 4 and we have the end so we have our post fix that had defined here now for bigger Coalition you may want to specify limit so a number of elements that will be included into the result and if the collection exists that size with that limit all the other elements will be replaced with a single value called the truncated argument so let's see what all of this means so let's say that I have a list called the numbers let's type here Val numbers and I'm going to create a range from one to 100 so what we have here is 100 numbers and let's say that I type here print line but first let's convert this to a list so I'm going to put this in parentheses so you put this in parenthesis and you put at the end that to list and this is going to convert now our range into a list and as you can see the the type is a list of ins and now if I type here numbers and if I run this code when I get all of our numbers displayed now with as I said with the join join tostring function we can specify a limit and also a truncated this is going to be the thing which is going to be sold out after our number limits so what I can type here is I can type join to string and uh which is also one with parenthesis so hero type limit the named argument limit and let's say that I don't want to get all the numbers as you can see here from to 100 and I want to get only the first 15 elements to do this you just type here limit 15. then we type truncated and that is going to be that this trunky thing is going to be showed after our limit number so I'm gonna put here uh quotation marks less than um sine dot dot and uh greater than PSI so now if you run this look at what we have in the output now we get we only have the first 15 elements and then for the next elements we only have this uh string that we typed here this is this expression that we have here and we can change this if you can change this let's say to 25 so if you run this now you'll see only the first 25 elements displays foreign to string with the limit name argument and the truncated now let's say that you want to customize the representation of elements of the elements themselves you need to in that case you need to provide the transform function so what we can do is that we can type here print line let's say and I'm going to type number strings put dot join to string and choose this one with curly braces and here I'm gonna Define how this uh this uh list is going to be transform so how's going to be changed so I'm going to type here quotation marks element and I'm gonna put colon we're going to put the dollar sign and put it dot uppercase so we're gonna uppercase all the elements so if I run the code now get element and get one so you can get one uppercase an element to get two uppercase element three uppercase element four uppercase so this is how you can use the transformation uh we can this I can transform your list we using the joint to string function so this is our discussion about the string representation and now I'm going to move to the next sections so I'm gonna end the video now now it's time to start a discussion about filtering so what is filtering filtering is one of the most popular tasks in collection processing in kotlin filtering conditions are defined by predicates and that is Lambda function that take a collection element and return a Boolean value true means that the given element matches the predicate false means the opposite the standard Library contains a group of extension functions that lets you filter collection in a single call those functions leave the original collection unchanged so they are available for both multiple and read-only collections to operate the filtering result you should assign it to a variable or change the function after filtering now the basic filtering function is filter when called with a predicate filter Returns the collection elements that match it for both list and set the resulting Collision is a list for map it's a map as well now let's Define a variable here call number so let's type in val numbers I'm going to put equals to list of and I'm gonna type here one two three and four now if you want to filter this list what you need to do is let's create another variable here called longer then three I'm going to put equals I'm going to type numbers Dot and we type filter so filter and we choose this one and here we defined how our list so we will Define the expression which is gonna determine how our list is going to be is gonna be filtered so I'm gonna type here it so the element dot length let's say greater than 3. now if we I add the print line down here print line now this list is going to contain all the elements from our numbers list which are longer than three so if I put here longer than three and if I run this we get 3 and 4 because those are the only string numbers which have a length longer than three so I'm going to close the console next let's see how we can filter them up and for that I'm going to create another variable called numbers map foreign here the key is going to be a string key one the value is going to be one comma then key to to then key three two three and now I'm gonna put key 101 two 101 the value now if you want to filter now this map I'm going to create another variable called filtered mop and it's going to be equal to our numbers map but it's going to be filter so I'm going to type DOT number snap that filter and now I'm going to filter filter the map both by the key and by the value so we type here it dot key dot ends with so we we want to filter it first by the key and the one that key to ends with a specific character and that character is going to be one and so we put the operator and we want the the value to be greater than 100 so we put here it dot value greater than 100 and the only key which satisfy this condition that we find here it's only is this key so now if I add the print line here and if I type filter map so the map which was filtered using the expression that we defined here now if you run this you're gonna see gonna see this in the output because this is the only one which satisfy the condition so you get key 101 and we get the value 101 so this is how you can filter them up using the both the key and the value now the predicates in filter can only check the values of the elements if you want to use element position in the filter use filter indexed it takes a predicate with two arguments the index and the value of an element to filter correction by a negative condition use filter not it's written as a list of the elements for which the predicate yields false so let's see how we can do this so I'm gonna declare two variables down here file filtered index is going to be equal to numbers or a variable that is defined above that filter index and this is gonna take two parameters index and the value so I'm going to type here actually you need to put curly braces index let's change this to value actually let's keep it as s Ctrl Z and here we're gonna Define our expression by a by which our list is going to be filtered so I'm going to type here that first I want the index to not be equal to zero and I I also want that the value of the element so actually let's change this to valid to make more sense so let's type here to value because we're talking about those ones so I want the value of that string so the value dot length I want I want it to be less than a 5. all right so this is the transformation if you want this is not a transformation this is how we want to filter our numbers list that we defined above I want to filter both by the index so this is why we use the filter index and also by the value and I want the index to not be equal to zero this is the first condition for the filtering and I also want so use the end operator that the valued of the element the length to be less than five now if I print this if I added here a print line but first let's Also let's also use the uh filter not so I'm going to type here Val foreign filtered nut and I'm going to type equals numbers dot filter not curly braces and we type here it dot length so the value of the element is to be less than equal to 3. now if we output those two in the console so if I add here print line and I'm going to Output filter Index this should be filtered in the solicit Factor this so let's type here in the index I type it already so let's type here edex actually it will make more sense but I have Elixir so why anyway so I'm gonna output that first then I'm gonna hear a print line and I'm gonna type filtered not and filter not as I said is gonna return a list of the elements for which the predicate yields false now if you run those two look what you're gonna have on the output so this is the output for our first for this print line and for this print line so let's think about what we have here first we have two and four and we Define the filter here first the index which should not be equal to zero so the one is first excluded and we also want to that to the value that length to be less than five so the only ones which uh for which the value is less than five is the 2 and 4 because the length of the three is bigger than 5 because it has a length of 0 1 2 3 4 and the length is 5 but I want the length to be less than five not less than equal than five so this is why this is not included and you only have two and four next uh now use the filter nut and it's gonna as I said it's gonna return a list of elements for which the predicate for each this expression is gonna yield false so it's gonna go through all of our elements and it's gonna return the elements for which this is false so we get three N4 because those are the only ones which are not less than equal to three they are greater than equal to three so this is why we have here three and four because this returns if Returns the elements if the uh the the length of the element is less than equal to 3 so this is why you get here 3 and 4. and there are also functions that narrow the element type by filtering elements of a given type so there is a function called filter is instance which returns a collection of filaments of a given type being called so let's see how you can use that but first let's create a Val mixed let's call it mixed list I'm gonna put equals another card type list off and I'm gonna Define some mixed elements here so I'm going to type here let's say one two three then some charts like a B C now so on strings let's type here hello World another string Alex and let's also type a Boolean so let's type here let's say false now there is a function as I said which which Narrows the element type by filtering the elements of a given type so we can use this function called filter is instance so what you can do here is we can we can type mixed list Dot filter is instance so we choose I think this one not this one filter is instance of Y so mixture is that filter is instance and here with inside the angle brackets we Define the generic type for which this list is going to be filtered so let's first choose the chart Char then I'm going to put that for each so I'm going to use the for each Loop and I'm gonna add print line and I'm going to type it here so I'm going to type the parameter which is the each chart so now if I run this we will get only the charts being displayed here because it is filtering by using the instance of charge so you get the charge if I change this to to in now I'll get the integers from our mixed list so if I run this now get the integers one two three that we have defined here and if I change this to let's say a string I will get the strings inside our mixed list because filter is instance it's gonna take the specific title that you type here and then it's gonna Loop through all of those types which are of this type in this list so if I run this I'm gonna see Hello World Analytics so we get hello world and Alex also I can filter for Boolean values if I type here Boolean is gonna it's gonna output in the closet or the one Boolean value that we have here which is false so if I run this I get false so this is how you can use the filter is instant function on types to filter the mixed list and you can also put that because this Returns the list this entire thing a filter at least you can put that for each to call the the this the for this for each Lambda function and then we output them in the console uh the next thing that you can look and that we're gonna look at is called Partition so I'm going to add a comment here but I'm going to hide the console first so I'm going to put here a comment I'm going to type here partition part T1 so partition and this is an alter another filtering function called Partition and it filters a collection by a predicate and it keeps the elements that don't match in a separate list so you have a pair of lists as a return value the first list is containing the element that match the predicate the predicate and the second one is containing everything else from the original collection so I'm gonna take again our numbers that have defined the path so I'm going to type here uh file and to to get this partition we put we put parentheses and here to type match so this is going to be the values which are going to be matched by the predicate and I'm gonna type here rest and you're gonna be stored the rest of the value which which don't match the expression the predicate that's going to be defined and I put here equals numbers dot partition and we type here it Dot length greater than 3. now if I other print line here I can print first the match let's press Ctrl D and now I can print the rest of the elements which don't match this this condition this expression that is defined here so if I run this code you will see first all the elements which are greater than 3 and then we're gonna see the rest of the elements which are not greater than 3. but let's add the space here to make things more clearly so we're going to add a hero print line quotation marks for recession so let's run this again so we get three and four so those are the elements which are coming from our match list which is defined here uh which is uh which satisfy this condition which is greater than 3 so we have three and four so the length is greater than three and then we have one and two so those are the rest of the elements which are not satisfying this condition that is defined here so we have one and two so this is how you can use the partition function to to get the basically to get a pair in which the return of value the first is the first is the list containing the elements that match the predicate and the same code is the one containing everything else from the original collection so this is how you can use the the partition function so now I'm gonna end the video and see you in the next video now it's time to look at testing predicates and those are functions that simply test the predicate against the collection elements and we have three functions any which returns true if at least one of the element matches the given predicate then we have none which returns true if none of the elements match the given predicate and then we have all which returns true if all of the elements match the given predicate so let's test all of them so I'm gonna type here print line numbers that let's start with any so we put any so here we type it dot ends with and let's put let's say e then out of another print line numbers dot none it should be curly braces eat Dot and sweet let's say w and print line numbers dot all let's say it dot length so if if the length of all the elements is greater than one so now if you run this all of those gonna return either true or false so get true true and true this is because first testing any and then this returns true with at least one of the elements much in the given predicate so it is true we have two elements which ends with the E we have three and one so that's why you return true there then we check to see if uh none of the elements ends with W so we're checking to see if none of the elements uh in our numbers ends with w n is true not only for elements will end through double so we have two in the output then we check numbers.org so we check into if all the elements the line the length of all the elements the element strings that we have here one two and three are greater than one and this row all of them are greater than one so this one have true true intro so this is how you can use the test predicates uh on your collections first time to look at the plus and minus operators so in Catherine plus and minus operators are defined for collections they take a collection as the first operand and the second operand can be either an element or another collection the return value is a new read-only collection and let's look at an example on this I'm going to type here Val numbers you want to put equals two so now I'm going to type your Multiple List off Multiple List at least with we to which you can add and remove elements and I'm gonna type here one two three and four now if you want to add an element to this list you need to type here numbers dot add and here you need to specify let's say five and now this new element is going to be added to the list but with the plus and minus operator you can do we can do this in an another way so you can type here uh but I'm gonna put this in another list so you can type here Val plus list so we put equals to and type numbers Plus and to type five and now this element is going to be added to our list that we have here it's going to be added to the the string five and it's going to be stored in this plus list now let's look at the minus operator here Val I'm going to call this minus list and put equals 2 and I'm going to type numbers so now I'm going to use the minus operator so I put minus and we type minus multiple list of and we put here let's say three and four so we type here three and four I have an underline let's see what it says now anyway let's run our code to see what to get in the output but we need to add some print lines together so I'm gonna add here a print line plus list and another print line minus list now if I run this again we get one two three four and our Five Element added to our numbers list from our class list which is outputted here and then we get 1 and 2 because 3 and 4 were removed using the minus operator so this is how you can use the minus and plus operators with the collections so this is our discussion about the plus and minus operators and I'm going to look at we're gonna uh move to the next section so I'm going to close the console and I'm going to end the video now it's time to start a discussion about grouping so the kotlin standard Library provides extension functions for grouping collection elements the basic function Group by takes a Lambda function and returns them up in this map each key is the Lambda result so the result of that expression inside the Lambda function and the corresponding values is the list of filaments on which this result is returned this function can be used for example to group a list of strings by the first letter you can also call Group by with a second Lambda argument a value transformation function in the result map of group y with two lambdas the key is produced by key produced by key selector function are mapped to the result of the value transformation function instead of the original elements so let's see what all of this means by looking at an example so if I type here Val numbers and I'm going to put list of again one two three four and five now we I can add here a print line I can type numbers and I can type here dot Group by and I'm gonna group it by it dot first so the first letter in in one of our elements that uppercase and now we're going to look at the next the next Group by with the key selector and with the transformation function so I'm going to type here print line numbers Dot group y so we have this one key selector so you type here key selector equals and here we put curly braces and we type eat that first so the first letter in our element so first it should be here we put a comma and we type value so the how the value of the the value of this list is going to are going to be transformed and here we also put curly braces and we put it that uppercase so put it curly braces it should be it dot uppercase let's press Ctrl alt L to format code and now let's run our code to see what we get in the output so we get for the first one number the numbers are grouped by for uh and we have this Lambda it that first.apper case it takes the first letter in Upper cases so it gets whoa whoa so then you get one we get T we get to we get F we get four we get uh then we use this one which on which we we uh you we we group uh elements with a second Lambda argument with the value transformation function and the result uh map of group y with two lambdas are the keys produced by the key selector and the function are the function are mapped to the result of the value transformation function so the results are mapped to this transformation that is defined here so this this is what creates the keys this is what creates the key this uh Lambda function and this is what creates the the the the the values so we get all because you get in that first so the first letter and get one because this is the value so the value is uppercased we get one so we get one here then we get again eat that first for the for all men so you get T then you get two and I get uppercased and get F lowercase f and get four and uh and five so this is our discussion about grouping and uh my suggestion for you is to play with the code try different values for the key selector for the value transform for uh try to group The Elements by different expressions and just play with the code until you get uh get uh until you get comfortable with the code now it's time to start a discussion about the driven collection parts and the quoting standard Library contest accession functions for retrieving parts of a collection these functions provide a variety of ways to select elements for the result collection listing their position explicitly specifying the result size and others I'm going to start with the first function called slice which Returns the list of collection elements with given integers the indices may be based either as a range or as a collection of integer values so I'm gonna create first domain function I'm going to type Val numbers I'm going to create a list of and I'm going to type here one to three four five and six now to use the slice function we simply add here a print line and we'll type your numbers dot slice and we create here arrange so we type 1 dot dot 3 and next we're going to add another print line and I'm going to type numbers dot slice and I'm going to put here now zero dot dot four and I'm gonna type step two foreign list so slice here slice and I'm gonna add another print line here numbers dot slice and I'm gonna add now a set here so I'm going to type set off and I'm gonna type three five and zero so let's press Ctrl R till the format the code now if you run this code look at the output so you first get the first three elements we get to two three and four because uh we're starting from the index one so we get two three and four then we get from 0 to 4 so you get one but you don't get the two because you have this step two which steps the second element and then we have three and five because it's stepping for the four so this is what step two is doing here and next we have numbers slice and get four six and uh one but we get them as the string representation we don't get them as as a integers so all right now let's look at the next functions and those are the take and drop and to get the specified numbers of elements starting from the first you can use the take function for getting the last elements use the take last when call when when called with a number larger than the collection size both functions return the whole collection to take all the elements except a given number of first or last elements called the drop or the and the drop loss function respectively so I'm gonna add some print lines here I'm gonna add print line and I'm going to type numbers dot take three Another Printer line numbers dot take last hmm also three then another print line numbers Dot drop one and another print line numbers dot drop last five now if you run this code look what you get in the output but let's add a space here so on another print line quotation marks photosyn now let's run this code again so we get uh for you get numbers take three and this function basically takes only three um three elements from our list then numbers take last three is gonna take the last three elements from hourly so I have four five and six then we have a print print line numbers drop one so you have two three four five and six and the first element is dropped so this this is what this function is doing next we have numbers dot drop plus five and this function is basically dropping all the uh file the last five elements and you have only the one so this is what those functions are doing you can also use predicates to define the number of elements for taking or dropping and there are four functions similar to the ones described above and those are take while take last while drop while and drop drop last while and let's look at all of them but I'm gonna put a space between uh our code that we have here so I'm gonna have the print line here quotation marks photo session print line so I'm going to type here numbers dot take while and here we Define the predicate I'm going to type not eat dot starts with f in quotation marks now another print line numbers dot take last while and we Define here the predicate it not equal to 3. not equal two three another print line we type numbers dot drop while and we Define the expression the predicate which is going to be applied for our drop last while so it should be drop while here and type it dot length equals equals to 3. and what another print line numbers Dot drop last while and we type here it contains it dot contains quotation marks I no if you run this code we first get one two and three so because here we check in we're uh because using the logical not operated we want all the elements which don't start with f so we don't have four and a five we have only one two and three next we have numbers that take last while and we Define the expression for which is going to be returned the elements by it not equal to three so you only have four five and six and uh the the the three the three is is missing and we don't have one because take last value only takes the uh last elements so this is why we have only and six when you don't have three so it doesn't care about the first element or uh about uh the second element next we have numbers drop while eat that length equals to 3 and here we have we have so it at the lines equals to three and we have three four five and six so this condition is satisfied so it basically it drops all the elements which are equal to three so we have three four five and six and all of those are bigger than three and the ones which are equal to three respectively one uh uh two and uh let's see and six actually six is appearing here so one two I don't know why six supreme but this basically saying that it should drop while if that length equals uh to three so it basically drops all the elements which are equal to with the length three so we have this is what we have here um three four five and six six should not be but I don't know why it's here now the next that we have here is numbers dropped last while so again this is uh Focus specifically about the last element so it contains I so get uh uh one two three and four so because this drop last while is basically basically dropping all the elements all the last Elements which contain uh which contains I so we have six five so we have a drop last while so we have it that contains I so it drops all the elements which contains I so sorry for what I said previously so this way I have here one two three and four and uh the five and the six are missing because it basically drops the old Elements which contains the letter i so this is how you can use the take and drop the next function that you can use is called chunked and if you want to break a collection through parts of a given size then you can use the chunked function chunks take a single argument the size of the chunk and Returns the list of [Music] list of the given size the first chunk starts from the first element and contains the size of the elements and the second chunk holds the next size elements and so on the last chunk maybe may have a similar size so if I have here let's change this to numbers strings and let's type here Val numbers while I was changing that I should use refactor so let's use a refactor rename numbers strings so it will be changed in all the places we're using that and here have numbers and I'm gonna put equals and I'll put parentheses zero dot dot 13. and I'm gonna put that to list to convert this to a list and we add a print line to see how this chunk function is working so we got the print right let's close the console and we type here numbers Dot Dot chunked and would put three so it's gonna chunk our elements into three into um basically elements of three so we have zero one two three four five six seven eight and they're both on on chunks of three elements so this is what this chunks is doing so this is why I have here this result and the next function that you're going to look at is called windowed and and we we can also use a transformation on our chunked element so I cannot hear a print line we type numbers Dot chunked chunked which we also choose the size three then you put curly braces and here I'm gonna Define how our chunked elements are going to be transformed so we put it dot sum so it's going to sum the chunked elements so if I press Ctrl I'll tell the format the code and now if I run this look what we're going to see in the output so we get uh you get first the chunked elements here in entry in three elements and then we have our chunked elements but they are summed up so we have first three because zero plus one plus two is three then we have three four five because that is twelve don't have seven eight uh seven uh six seven eight and they have twenty one then we have uh 10 11 and 9 and we have 30 and so on so this is uh how uh you can use the chunked function to chunk the elements together by a given size and you can also use the transformation function to do a transformation on them like adding them so as you can see we have adding them here next we're going to look at the next function function that you can use and that is called the windowed function and we can retrieve all possible ranges of the collection elements of a given size with the window function the function of getting them is called windowed it returns a list of element ranges that you would see if you are looking at the collation through a slightly wind off of the given size unlike chunked window returns element ranges Windows starting from each collection element all the all the windows are returned as an element of a single list so if I have here the let's create another variable here let's call it Val numbers string two and we're gonna type here let's say or I can assign I can assign the number of strings here so I'm going to type here number strings now what I can do here I I can add a print line and like I can type numbers string store Dot windowed and we choose let's say three and let's see what we have on the output so now if you run this code I should have added here a space so let's add the print line here backslash photo selection foreign so we have one two three then we have two three four you have three four five and four five six so this is similar to junk but window provides more flexibility because uh you can specify a step which defines a distance between the first element and and to a DH and windows by default the value is one so the result contains Windows starting from all elements if you increase the step to two you'll receive only Windows 30 from the other element first third and so on and finally you can apply transformation to the return ranges right away to do this you provide the transformation as a Lambda function when calling windows so it is similar to chunked and um so with this I think we end our discussion about the thieving collection parts and see you in the next video and if you find this confusing don't worry because it's so confusing for uh for me for me and for probably other people because it takes time to to get used to this and my suggestion for you just play with the code change the the parameters play with the functions try different uh values and so on so see you in the next video now we're going to look at some functions with which you can retrieve single elements from our Collections and the first one is one which retrieves an element by its position so I'm gonna create the Val numbers again numbers equals to list of and we type here one two three and four and also five and let's say that I want to get the element at position three to do that just add here a print line and we type numbers dot element and here you specify the position three so zero one two three so we're going to get four outputted in the console so we get in the output as expected for now there are there are also two functions for retrieving the first and last element and to do that just add another print line here and type numbers that first so this is gonna retrieve the first element and Ctrl d numbers Dot last so this is gonna receive the first element one and last is gonna retrieve the last element five so if you run this we get first four from our disappearance line then we get first one and again the last five and we can also edit three elements by condition so I can type here uh I can type down here or or I will type it here actually I'm going to type it down here it's going to add here a print line numbers let's say DOT first now I'm going to retrieve by a condition so once I first I'm going to choose this one with curly braces and the condition is that I want to leave the first element for which the length is greater than 3 so I'm going to type here it dot length greater than 3. and I'm gonna add I'm gonna press Ctrl D because I'm gonna do the same thing for the by condition so I'm going to type here numbers that last but I'm gonna change the condition I'm gonna change it to eat that starts with the it that starts with the letter f so now we're retrieving the first element which is greater than three and next retrieving the last element which starts with the letter f so now if you run this we get 3 and 5 because 3 is the first element which is has a length greater than three and can get five because this is the one the last element which starts with the letter F and if you can other space here if you want to make things more clear so we're gonna add the print line quotation marks backslashing actually forward selection so if you run this we get three and five output today in the console and we can also retrieve a random element from our numbers so I can type here print line numbers dot random and this is going to return a random number from our list of numbers so if I run this we get one and if I run this again get four so every time you run this you'll get a random number and you can also check if the list is empty so you can type here print line numbers that is empty then that is going to return true if the list is empty and if the list is not empty it's going to return false so if you run this we get false so this is our discussion about how to retrieve single elements see in the next video now it's time to start a discussion about aggregate operations so kotlin collections contains functions for commonly used aggregate operations and those are operations that return a single value based on the collection content most of them are well known and work in the same way as they do in other programming languages and we have minor null and Max ornal which return the smallest and the largest element respectively and on empty collections the return null then we have average which Returns the average value of elements in the collection then we have sum which Returns the sum of elements in the collection of numbers and have count which Returns the number of elements in our collections so please declare a list numbers list of let's put so let's put some numbers here like let's say six then 14 4 let's say 100 now let's press Ctrl format the code and let's add the print line here let's put quotation marks and let's type the sum is dollar sign and the type here numbers dot sum numbers that's sum all right and uh I'll add another print line and now this is gonna say the count is again dollar sign numbers dot count another print line the average is again dollar sign numbers that average another print line and now I'm going to say the max value is again dollar sign numbers dot marks numbers Dot marks or null and I'll print line the mean value is dollar sign numbers that mean or null now if you run this code you're gonna see in the output the corresponding values for those expressions that we have here so again the sum is 134 the count is 5 because we have five elements here the average is 26.28 the maximum value is 100 and the minimum value is 4. so this is how you can use those aggregate operations and agree and those aggregate um functions and beside the regular sum there is an advantage so much summation function called sum of that takes a selected function and Returns the sum sum of its application to all collection elements and let me show you how this works so you just type here so we type here print line the sum is dollar sign numbers dot sum of we select this one and here we type it times two now if you run this what it's going to do is it's gonna sum all the numbers like the first function that we have here so it's going to sum 134 and it's multi is going to multiply that that number by two so if you run this we get 260 which is 132 times 134 times 2. so this is how you can use the sum off with this uh transformation which is gonna basically multiply the list with a number with the with the sum of the list with the number so this is our discussion about aggregate operations and see you in the next video now it's time to start a discussion about ordering and in this video we're going to look at comparable and add comparator interfaces so first I'm going to create a list of numbers and I'm not gonna I'm gonna get a multiple list so Multiple List off and I'm gonna Define some numbers here not in a specific order so we type two let's say five one let's say 40. 20. 100 let's say 60. now what if I want to order the numbers that I have inside our list numbers to do that you just need you type numbers Dot and there is a function called sorted so if I type number that's sorted now our number on our numbers are going to be sorted so if you type here for each put in the line it so now if you run this even though we didn't type our numbers in ascending order there will be sorted and as you can see they are sorted we have one two five twenty forty six three and one hundred so they are sorted by this function called sorted and why this is working it's working because if you click on this sorted function what a actually if you type here let's say let's say that I put the type here and if I click on the type this tie this type integer this class is implementing this thing called comparable and this comparable has a function called compare to so when we actually type numbers that are sorted what what internally was happening is that the integer class was using the compared to function which is which is a function which you want to you need to implement if you implement the comparable interface to compare if to compare our numbers and to based on that to to sub them to to sort them and now let's say that I have or let's say that I have a data class called laptop and it's gonna have a variable called brand it's going to be of type string another variable called here this could be the the year one one this specific version was released on int also need and the wall let's say um price also an integer right now if I create here a list of laptops laptops equals to Multiple List of and I type here laptop let's say that I type here Dell and I put the year let's say 2021 the ram let's say that is four gigabytes RAM and the price will say that is 600 okay comma I'm going to create another laptop here so another object I'm gonna type here let's call it Acer is going to be let's say the year um let's put 20 20. the para is let's say the ram let's say that is eight gigabytes Ram and the prices say that it's 100 dollars comma and let's create another laptop object so we type laptop and create an Apple laptop which is which you're gonna for which you're gonna choose the the year let's say um Tony 2020 2022 and for the ram let's say they're choose 16 gigabytes RAM and 1 000 for the price now if I type here laptops that sorted let's say that I want to sort the laptops as if you can see while on time pink the IntelliJ is not giving me any hints to have this function sorted as a true fill in that function because that function is not working on our laptops list and why why is happening that that is happening because the IntelliJ doesn't know how we want to sort this laptop list that we have here because you want you can sort it in many ways you can sort it by the name you can sort it by the year you can sort it by Dynamic and sort it by the price so when you say laptops are sorted the IntelliJ is not it's not annoying what do you mean because previously it was working with our integers or and without integer class because the integer class if you type if you put the type here back integer the integer class or the int class what I was doing actually it was inheriting from this comparable interface and it was implementing the compared to function which is used when you call the sorted function and inside this comparative function it has defined its own Logic for comparing integers for comparing whole numbers and what we need to do in order to be able to sort our list of laptops is we need to implement the comparable interface and you need to Define our own logic which is going to determine how our list is going to be awarded by by which uh property by the Year by the ram by the price so this is what you need to do and to do that just put here a colon and we'll implement the interface comparable so we type it comparable and we have a suggestion you should choose this one we put angle brackets and here we type laptop because you want to implement this we want to compare laptops so laptops so this swipe water level there then you put curly braces and now we need to implement the function so click on that it says Implement members you have the compare to function now you don't need to Define our logic which is gonna determine what makes uh uh zero the final logic which is going to determine how our elements is going to be watered by what criteria and I'm gonna order the the laptops first by the price and to do that to do that just type if and to type this and we type in this because this is going to be called on an inst an instance of our laptop left of class is going to call the compared to function and it's going to compare with another argument so if this dot price we say here is greater than other that price we we return as positive number so we type return one and a positive Value Plus simply shows that the receiver object so the objects this object is greater than the the uh the object which was passed so this is what this means this one else lcf is the receiver object is not so if this dot price is less than other that price let's say then gonna return -1 a negative number so I'm going to put here minus one and what this basically logic is I'm just going to swap them so it's going to swap the elements based on this logic else I'm going to return 0 and that is going to mean that they are equal so if you type here return 0. and if you click here it says that you can write this in a different way so if you click on this and let's add the print line to see that our if if uh are called so if I type here print line I'm gonna say in if statement dollar sign actually let's type swapping dollar sign this dot brand name with dollar sign other dot brand so let's add this print line also in our lcf and I'm not gonna add in inside the ears because our we don't have Elements which are equal but you can add that if you want now if I type laptops that's sorted now I have a suggestion and if I type for each print line it so print the element now if you run this look you're gonna see the elements sorted and uh ascending order by their uh their price so you see that we have first the brand the brand name Dell and we have price 600 then we have the price uh you have laptop Acer and we have eight hundred dollars and have left to apoll the brand and you have the price one thousand dollars so the nearest so now they are sorted using our own logic which was defined inside this comparable interface and which was defined inside the which was defined by this comparable interface and which was defined inside this function compared to that we've overrided inside our client and as you can see if uh you look you see here that he says if an if statement swapping Acer window so the elements are swapped based on our road in if statements it says swapping apple with Acer so they are they are swapped based on our logic so this is how you can use the comparable uh interface but what if I want now to compare by the let's say uh RAM what can I do I can't implement the comparable interface again here and I can't uh I I can I can add the that property here but that is gonna conflict with my logic with for the price so what can we do and here comes into action comparator with comparator you can compare your uh your list you can you can uh com you can order actually I should say you can sort your list using multiple properties so you can order it by the uh brand name you can order by the year we can already buy the ram you can already buy the price and with compare because with the comparable interface we can do that just only by one property and that is pretty uh inflexible and it's not what you want and how how to use this comparator to use the comparator we just type here class I'm gonna call it comparator let's say Ram and it's gonna extend from comparator so type comparator and you have the type and for the type here we want to compare laptop so you type laptop here angle brackets curly braces and press enter and now we need to override the compare function inside our class so you override that function and here again let's change those to laptop one so no now we have laptop one and laptop two and we Define the same logic so we type here uh return if because you need to return an integer if this dot Ram actually not this that ram laptop laptop1.com is greater than laptop 2. Ram and we need to delete this nullables because you need to have some errors there and put curly braces return one else if else if laptop one dot Ram is less than laptop 2. laptop two dot Ram then gonna return I'm gonna put curly braces I'm gonna type return minus one else we're gonna return zero now if I want to now to compare our let's add the space here now I want to sort our elements based on the RAM and another print line here to add a space so I'm gonna have the biggest photos in also here one so go quickly space it here should be print and now what we can do is we type laptops Dot and we type here sorted with and which is we choose this one which has the parameter Define a comparator and we're going to pass our comparator that we defined here with the comparative function so I'm gonna pause I'm going to type sorted with and we type comparator foreign our class and create an instance and within the type dot for each now this one for each print line it so now if you run this you're gonna see them sorted by their border Ram so if you run this as you can see uh if you look at the if you look at the first there are they are First Source did by their price we have 68 800 and 1000 dollars and then we have them sorted by the ram so we have four for the four which is the dell and then we have the Acer which is uh eight gigabytes around and you have the Apple which is 16 and uh if you look uh actually they are in this order in the list so let's change this to to let's say to 16 and these two to wait to to make it more clear so let's run this again so as you can see they are still started so we have first the Dell which has four gigabytes of RAM then we have the Apple which is eight then we have the Acer which is 16. so this is why so now it's sorting our list this sorted width using comparator Ram that we defined we created and then we Loop through all our all elements because that Returns the list so this is how you can use comparator and if you want to uh to to sort of let's say now the list by the year you just create another comparator so you type class comparator let's say here and it's also going to extend comparator comparator is going to have for the type laptops because it's gonna Source laptops curly braces we implement the function compare and to define the logic for comparing elements using uh using the ear so let's delete this nullables let's type here laptop one and here laptop too and I'm gonna copy this chord I'm gonna paste it here but I'm going to change this from Ram to here so here here also here again and we have an error here missing so let's add the curly brace here all right so now if I want to to have the element sorted by the year we just type here let's put a space Also print line quotation marks for us this run and found the laptops to be sorted by the by the by the year I just like laptops that sorted with and this expects a comparator so I'm gonna call our comparator that we created comparator here comparator here an instance of that then for each now this one again for each print line it so if you run this now we're gonna see the last element sorted by their ear I have as you can see you have uh we have them sorted by the ram so this is from this one and now it's using comparator here so you're sorting the embodies we have 20 20 21 and 2022 so this is just not like the order that they are defined in uh in the list so this is how you can use comparable and comparable but if you think about there is a lot of code here to just have to have our our list so that you have to we found to you have to you can use the compare the comparable and with the comparable you can use it with just one property and if you want to use it with another property you have to create those comparators which gives you some flexibility but still you have a lot of code and we can remove all of this code and use Lambda functions so I can delete all of this all of this comparable that we have here and instead of using those comparators and all of this stuff what I can do is I can delete all of this I can little or this also now what I can do is I can add here laptops dot sorted with and here so we choose this one sorted with which has this parameter comparator press enter and here we type compare by and here we type and this line of code that we have here we it what it actually is doing is creating a comparator but is creating a comparator using a Lambda expression so here you can type it dot it's dot let's say uh price right and then for each print line it so this is equivalent to creating that comparator here and inheriting from the comparator interface and defining the logic for uh uh or ordering for sorting them so now if you if you run this this will have the same effect like the comparator price that we have implemented previous as you can see they are ordered now by the price and I can do now on another line of code Source dot laptop dot sorted weight and we type here compare by we type it dot let's say uh Ram dot for each print line and it now if you run this I'm gonna have the same output let's add the space between them print line so let's add the space to see them to see the code more clearly and now as the as you can see the first they are sorted by their price and then they are sorted by their uh their RAM memory so this code is equivalent to creating what we had previously with the comparator and implementing the dotting interface and the function and actually there is a shorter way even to do this we can delete this let's say so the sorted with and compare bear compare by and we can just type here sort by so this this will create internally the same thing that we had previously so if I type it dot ROM and I can do the same thing here I can delete all of this and I just could type here selector the sort by eat that price now this will have the same effect like all the code that we had previously but now it's extremely concise and easier to read you just say laptop sorted by sorted them by their price so the elliptos by the ram so if you run this code you'll see the exact output in the console because what this function is doing uh actually we should Loop through them so let's add the print line here print line it so let's put here for each put into line it so now if you run this you will see the exact same output we just this simple line of code so as you can see you have the same output we have them sorted divide their price first and then they are sorted by their RAM memory and if you hold Ctrl on this sorted by function as you can see this actually internally calls the sorted width which receives the comparator and is calling the compound the compare buy so this is like a syntactical sugar for us which makes the code more concise but internally it's using using that sorted weight and uh if you want to use the salt to do it one advance for using a sorted with let's say that I type here another print line to add a space let's put photos lesson should be in quotation marks forward slash n one good thing about the sorted width so let's type laptops Dot sorted weight and here we type compare by let's say it dot year one thing that you can do with the sorted with if you call specific restorative function you can put that and then buy so it will sort by year and then by I know let's say uh it dot price so this is what you would get what you can do with the sorted with you can sorted by year first and then by uh by the price so if you run this as you can see they are sorted first by the year so and then buy their uh their price so this way we get this in the output now I'm gonna end this video and uh you should you should use this uh this one always because it's concise monitable yeah very easy to to to read and to and to type is in contrast with what we had previously with the or creating that comparators and implementing the comparator interface or the comparable this is a lot a lot more concise and easier to read so this is our discussion about the comparable and comparator interface so this line of code I repeat this line of code that we have here this sorted by it does RAM is creating internally that comparator that we talked about the node we're just using this Lambda function so I'm going to end the video now and see you in the next video so there is one mistake that I did previously so if I press Ctrl Z to have this code uh when I run this code you you didn't sound output then the list sorted by the year and then by the price and that is because I forgot to add the four each to Loop through our elements so if I add the four each and now if I run this now we're gonna see them sorted first by the year and then buy the price because previously it wasn't so this is why it wasn't now if you look they are sorted by the first by the year so we have 2020 2021 and 22 and then buy uh by their price so this is why previously you saw this one this output and also I saw this output that but uh some way I uh I didn't uh didn't saw that I forgot to add the foliage here so this is how you can also sort the sorted width you can um sort it by more elements you can put here I think another then buy not here we can put another so dot then by you can put another then by here if you want so eat that so let's say your RAM so you can add more more than buy if you want so now I'm gonna end with the video see you and see you in the next video now it's time to start a discussion about binding the search but before you look at binary search you're going to first look at linear search to see why a binary search works better so I'm gonna type a function here I'm going to type private fun it's going to be called search element and you're going to type search elements so this parameter is going to be the element that we are searching for and it's gonna then another parameter is going to be a list of numbers so it's going to be a multiple list of ins and it's going to return a number the search element or minus one if you don't find the search element and here we're going to Loop through our release so I'm going to type for number in our list of numbers if at a particular iteration or number it's equal to the search element that means that we found the element that we found the number so we're going to return number else if you come down here and after we Loop and we did our if checks we didn't return the number that means we didn't find a number we're going to return minus on here now I'm gonna add the print line here and I'm gonna type search element because this is going to return an element and then you're gonna output with the print line dot in the console and I'm going to type here 27 and for the next parameter I'm going to define a list of numbers one time Multiple List off and here I'm going to define a number from 1 to 30 so I'm going to type here the numbers one and our last element 30. now if you run this code you're gonna see in the output 27 so we get as expected 27 but let's declare a variable here I to number the number of iteration it took it took to find the elements I'm going to assign 0 to it I'm going to increment it every time you Loop so I'm going to type Val I'm going to type I sorry plus plus and I'm gonna print line here and I'm gonna it's gonna say search number colon dollar sign I so now if you run this we're gonna see how many iteration it took to found our element and if you look at the console as you can see it took 27 27 iteration before we found our element because the way the linear search is working is it's going through all of the elements is checking out each iteration if the number of that particular iteration is equal to the search element if not it's going to loop again and again again until it reaches 27 then it found that element and it Returns the element and you get that element outputted here in the console so this is what we call a linear search and this is not particularly good because imagine if you have 1 billion elements or 10 billion elements and you need to find I don't know maybe the 7th billion element in the in that array that is going to be very hard and it's going to take a time and memory and because of that we have another data structure for a searching element and that is called binary search and I'm going to type the code for binary search here and also you're going to see the number of iteration it tooks to find element and also I'm going to explain how binary search works so I'm going to delete this I'm going to type here VAR low I'm going to put equals to zero VAR High equals to numbers that size minus one I'm going to explain the code immediately here I'm going to type while low is less than equal to high here I'm gonna type Val mid so now we're going to get the middle element so I'm going to put parenthesis slow plus High divided by 2 and that's going to give us the middle element 15. then I'm going to type Val comparison so I'm going to type CMP equals to numbers dot get the middle element compared to we're going to compare the middle element with the search element then I'm going to type here if now I'm going to type if comparison is less than zero then I'm going to type here low equals to mid plus one lcf if comparison is not less than zero so it's greater than zero I'm going to type here that low is equal to High sorry is equal to my mid -1 else when I type here return numbers dot get meet and that is going to give us the middle element now if I declare here a variable VAR I and if I assign 0 to 8 and if I increment that I at each iteration and if I add a print line here search number dollar sign I now if you run this you're gonna see uh you're gonna actually I should return minus on here because uh if at the end of our looping and after we checked our all of our list and we didn't find the number then we determine this one meaning that we didn't find the element so now if you run this again we get search number one two three and then we get 27 and as you can see this is significantly different from our linear search because now we only took three searched and then I found the he found our element previously we had to search through all of our elements through our elements until uh the number 27 to to get the number seven but now we only get the three iteration and we get the number 27 and how is that possible this is because now we're using what is called the binary search and how this binary search works I'm going to explain it now so now let's see how the code works so first we have a variable declare code load which assign a value of 0. then we have another variable called height which assign number the PSI minus one so we assign the size of the array to our high then we have a variable called I to which you assign 0. then we have a while loop and we start looping by this condition while low is less than equal to high then we increment our I to keep track of how many iteration it takes before we find the element and without any console search element and the number at that iteration then we have a variable called mid and this is going to give us the middle element and to get the middle element we add the lower lowest element plus the highest element so yeah we'll add here 0 plus 30 divided by 2 which is 15. so this is the middle element then we declare another variable called comparison and we type here numbers that get the middle element which is 15 compared to search element and if the middle element is less than the search element that means that the search element is on the right of the numbers which come after the 15 and because of that this is gonna return because our middle element is less than the search element is going to return a negative number so this is going to be true comparison is going to be less than zero and then I'm gonna assign low equals to Mid Plus on so now the low variable has the value 16 all right now it will loop again it will uh it will uh do it will have the I incrementally it will do the while loop it will increment the I again and it will output into I in the console now here now it will calculate again the middle element and it will it will add now 16. Plus 30 divided by 2 and that is going to give give us 23. all right now that is the middle element now and what we do now here is we again uh I have our variable comparison and we get numbers that get 23 so we get the 23 element and we compile with our search element which is 27. and again because our middle element is less than the search element this is going to return on any negative number so this shift check is going to be true again now what is gonna happen is that now low is going to be equal to Mid plus 1 and the low previously was equal to 23 so now I'm going to have 23 plus 1 which is 24 all right now this will loop again or loop again so as you can see this basically breaks the the list in half at each iteration and now this will loop again it will increment the eye to Output I and now it will calculate again the middle element now the middle element is 24. and the high element is 30 and we have 24 plus 30 divided by 2. and that is 27 the exact number that we are searching for so this is how binary search works it will compare the middle element with the search element if the middle element is less than the search element that means that your element is on the right side of the element which come after the middle element so all the elements from the left are going to be excluded and it's going to search only on the on the right side then it will split the list again in half if the middle element again is less than the search element it will go to the right again it will speed the least in half I need to sooner or later it will find the element to to to the right or to the left so this is how one research version is very powerful because for a very big uh list you can use binary search and it's more effective that uh only the linear search and uh this is the code that I type but it doesn't you don't need to use this code because uh I only type this code to show you how the binary search works but usually you'll use the binary search function provided by The Collection so you will just type here return numbers we're gonna put square brackets and I'm gonna type binary I'm going to type here numbers again binary dot binary search because the binary search function provided by The Collection only return the returns the index so if I search for the 27 element that is going to return the index 26th and the index 26 then it's gonna be the number 27 from our numbers list so now if you run this you'll see 27 output in the console so get 27 and we did this one with one line of code you can even remove this and just have a single expression function so we can put here equals so just by that it will do the same thing that we did previously with all the code that I typed so this is our discussion about binary search and see you in the next video but before I end the video I should say that binary search only works with the order collection of elements so your elements need to be sorted in order to for the binary search to work and in our case we look we used integer numbers and it was easy because we typed elements in a in a sorted order but uh if the elements are not sorted by by research is not going to work also if you have your own class so you have your own objects and you search with using one research uh through a list for a specific element in that case your class has to implement the comparable interface or it has to to to to use the comparator interface and I'm going to show you how to do that in the next video so see you in the next video so now it's time to start a discussion about genetics so what are genetics genetics allows us to give to the compiler some hints about what kind of objects you are dealing with and this helps the compiler to figure out some errors at compile time and it also helps us to write more consistent and better code and we already use genetics when we look at collections so every time you use an array and you you specified in the angle brackets an INT or a double or a class that you created an object what you actually did there is that you use generic you set the compiler that that is the kind of data that specific collection is gonna store so if you have something like this while let's say numbers and we put equals is equals here and type array of here you can put angle brackets and you can specify a type here let's say in because I'm going to put numbers here and now this helps the compiler to figure out if let's say we want to add here let's say a string so if I type here numbers equals let's say your some text let's put in quotation marks some text as you can see you have those underlines red which says if you hover over here first it says that Val cannot be resent so let's change this to VAR to get the error that I want so let's put VAR here so we get here type mismatch required and found string so here we are using a generic type and the generic type is an integer and because we said explicitly here that this array is only going to store integers we cannot go down here and assign some string but as I said at the beginning genetics are only a compile timing feature they don't make it through the runtime and again we're going to come back to this later because this has some implications now let's uh delete this and let's create our own generic class to see how it works because here we're passing in but if you click on this array of you see that you don't have here any an intest the type that we SP we specifically decided to pass to this array but if you look here inside this library.kt and if you go to array here you see you see that we have VAR Arc elements and we have this t and T is a genetic type and the specific type that is going to be passed here is the type that we pass when we create an arrays when we want to store some numbers or some strings and now now let's see how we can create a similar thing that we have here with our with our own code so I'm gonna delete this so again generics are there to to to help the compiler to figure out errors and it also they are there for helping us to write better and consistent calls so that you you don't add let's say uh strings to to an array which is meant to store only numbers so first I'm going to create a class and it's going to be an Open Class and it's going to be called player and it's going to have a property called name so it's going to be a Val name we're going to Define this in the primary Constructor it's going to be a string now I'm gonna create open class here and down here I'm going to create two classes first is going to be called football player so football player and this is gonna have a name and it's gonna be a property because you're gonna gonna extend from our player class we're gonna derive from our operator class I'm gonna pass this property to the dot parameter name to our property name from the superclass so if we type here player because we were in inheriting from it and here first name so you pass your name next I'm going to create another class called baseball player so we type here baseball player and this is also going to have a name also only a parameter because the property is going to be ultimately defined by the superclass by the class from which we are inheriting from so here we're gonna inherit put the colon to inherit from our player player class and here we pass our name parameter that we defined here we pass it here to the primary Constructor of the base class from which we are inheriting from all right so now I'm gonna go up here and now I'm gonna create a class called team and this class is going to represent a team and this thing can be a football team or a baseball team and here we're going to create the class called team so we type the keyword class I'm gonna call it team and now here we put angle brackets and inside the angle brackets we're gonna Define the generic type t and you can use a different letter here if you want but usually and generally use the T because it stands for the for type parameter next to put parenthesis to define the primary Constructor and for the primary Constructor I'm going to define a Val name and this is going to represent the name of the theme and it's going to be a string and next I'm going to Define also valuable this is going to be called players and it's going to be a multiple list of also of type T so we type here Multiple List and we put here t right now I'm going to put curly braces because I'm going to define a function inside our class team so here we type fun and I'm going to call this function add players so this function is going to add players to the team we put parentheses and here we Define a parameter called called player and it's going to be of type T so it's going to be should put a colon here and we put curly braces and this is going to receive a parameter of type T and this type T that we Define here and here and here is going to be the type the specific type that we gonna pass when we create an instance with our class team so first here we're gonna check if the players so our list of players contains this player that is passed our ad player function because if or you already have that player in our list We're Not Gonna add it to our list so if player and to check if that player is in the list we call the contains function on our uh on on our uh Multiple List so here we we type players that contains player the argument and if that is true I'm gonna put curly braces and here we're gonna output something because to the console so we type here print line quotation marks and we type player colon and then we put dollar sign curly braces and here we need to do something which is called casting and casting casting is used when you want a variable to be treated as a certain type of variable so when you want a variable to be treated by the component by the compiler as a certain type of object or or a class so we type here player because let's let's let me show you why we need to do that because if I type here player now I want to get the name and if I put here dot name as you can see we don't have any name here because because this type because this T and this T that we have here is generic the compiler has no idea if this T that is going to be passed here so this piece so if you pass here a baseball player or football player it has no idea if at this moment now if that is gonna have uh is gonna have a name property on it this is why when you type here that's name we don't get nothing and to solve that we can say to the compiler for them to the compiler to treat this parameter here so this is going to be a value pass to this parameter as a player and in that sense in that in that way you can get access to the name property so we type here player and to cast to cast a variable to a certain type we put as so we put the keyword as and the type player and we put this in parentheses so we surround our expression in parentheses inside the curly braces and now here at the end of of the of the end of the enclosing parentheses you put that and now we have access to name because we settle the compiler hey treat this player variable I don't know because I don't know if this is going to be it's going to be a player a player object passed here or a baseball player or or a football player treat this player variable that is passed here as because here we have teeth so we don't know what it is three display to display a variable as a player so you can use the name of a variable and we're gonna say is already in the TM and we can put here the team and we can type here dollar sign this Dot name so the name of the TM else if if our player is not in the team we put else we're going to press enter to add the right curly brace we're gonna add this player to the list because if the if fails that means that the player is not present in our list so we type here players our Multiple List dot add this player that is passed player and we're also going to output something to go to the console so you add here print line and uh I'm gonna copy this because I'm just gonna change the text a little bit so let's delete this player and so here is we're gonna say instead of it's already I'm gonna say it was added in the team now let's create some objects with those classes that we have here so first I'm going to create some some players so I'm going to create first the football player so type here Val for the ball player equals football player and for the name I'm going to use a generic name I'm gonna type just football player one and I'm gonna press Ctrl D to create another football player so football player two is going to be called and I'm gonna create two baseball players so we type here Val baseball player equals baseball player and we type here baseball player one and I'm gonna call Press Ctrl D here also I'm gonna call this baseball player 2 and I'm gonna change this to 2. now I'm going to create an instance of our team class so we cut we type here Vault team and this is going to be a team of football players so we type Val team equals and hero type team and we put now because as you can see it's expecting a type here and the type is going to be football player so it's gonna be a team with what it's gonna be a team with the football players and you're gonna Define a name also generic name football team is going to be called and they also need to pass an array there and for this array I'm gonna type just uh mod multiple array of we can't foreign list of and here I'm gonna pass our football player I'm gonna pass only our first football player here now I'm going to create another team Val team uh let's actually call this first team football team so let's type here food bowl football team now if you run this code we don't get it on any output because our ad player's function wasn't called but if I type here a football team foreign actually here football team that add players and I'm gonna add football player too now if I run this code we get football player two was actually here should be added football player 2 was added in the team football team so our code works well and we use generic types for our classes here we specified only the T and this T that we have here was replaced with football player that we Define here and um uh we're gonna do the same thing we're gonna create another theme for the baseball player and we're also going to look at how we can restrict the types that are going to be passed to our generic type here so now I'm going to create a baseball team so I'm going to type here Val baseball team put equals then you put Here theme and here we type for the generic type T baseball player because this is gonna store baseball players and we Define a name here the name is going to be baseball team or generic name and uh also you need to type to pass a multiple list so type Multiple List and we pass here a baseball player but as you can see here for the type the type here is great oh that is because here we pass the football player uh object that we create then here we pass the baseball player because kotlin has Type inference it can infer the type as being a team of football players so we don't need to put here for the player we can delete this you can delete all of this and now our code still works and you can see we have this type here which says team football player so it's a team of football players and it's uh inferred it's inferred automatically by quoting for us and you can do the same thing if here for a baseball player so I'm gonna delete this as you can see now we also have the hint team baseball player now let's add to the baseball player let's call the baseball player function let's put here a so we type here base bullet team let's call the function dot add players and hero type baseball player 2 because first one was added there so now if you run the squad not debug so run this code let's increase this we get let's actually decrease this so let's put here we get player football player 2 was added to the team football team so we have this code here which is called and it says that the the football player was added to the team and the name of the football team and then we have player and we have baseball player player two so this this one that we have here that we pass here baseball team that was this to the baseball team as you can see it says player baseball player 2 was added to the baseball team and what generics helps out to do because I said they can help the compiler to figure out errors if you try to pass here baseball TM Dot add football player so we type here football player now you get an error because the generic type enforces the type on the the on the class because here we said explicitly that this is because this was inferred to be as a baseball player if you cannot pass here a football player in our baseball team because this is in first because you said Siri here explicitly explicitly because first because this was inferred from here so we have team baseball player so we cannot add here a football brain inside our team football player and this is very very powerful for us because in this way we don't do things which doesn't make sense and the the same is true about our football team so if on our football team so if enough of working with a football team dot add and here to put baseball player we get an error because we specified we specified that because the generic type was in fair to be a football player so we cannot put a baseball player in our team of football players so this is what generics is doing is figure out those errors for us at compile time and this is very powerful because we cannot we can run our code and we don't get in those some scenarios where we have a bay of baseball player added to a baseball team or maybe other examples there so I'm gonna delete this next we're gonna look at upper bounds because our upper bounds basically allows us to restrict what kind of type is passed to our generic type here so and particularly gonna see how this is gonna affect this code that we use here to cast so to to add an upper bound so to restrict what kind of type is passed to this type we can put colon so extends and here you can we can type player so what we are saying here is that every type that is going to be passed here when you create an instance like we did here so but only that this was in Fair here this type that is going to be passed here needs needs to inherit from the player class otherwise this type is not going to work so because of that because the compiler now knows that and enforces this that this type that is going to be passed here is is going to be is going to inherit from the player class we we can't delete this cast because now it knows that that type is gonna have uh it's gonna be it's gonna inherit from the player class so it's gonna have the property name so if I delete this and if I delete this so let's put name here now so let's delete these two should be player here player so now we have player the name because it knows that this type so this type that is going to be passed series is going to inherit from the player cards from the player class so it's gonna have the property name so you don't need to do this the weird this word cast is overcasting so I'm gonna delete this and now as you can see we don't have uh any arrows so now we have the name here because now it knows that whatever type you pass here it has to inherit from the player class so if I go down here and I create another class called gamer player so we type here class let's call it games player and it's gonna have a Val is going to be actually let's define a parameter only name is going to be a string and we will not inherit from our player class let's see what happens so if I um if I uh create here another theme let's call it Val let's call it the game Steam so I'm gonna type here team and we're gonna specify here games player now if if I put now the primary Constructor here here we need to define a name let's call it games team and multiple list of now here we have an error and if you look it says expected player found games player and this happens because our games player that we have here is not inheriting from the player class and because we said here that the upper bound is this T that is passed here so this T is this here has to inherit from the player class otherwise if you if you don't uh inherit from the player class it will not work because you said here that it it must inherit from the player class now if I change this to if I change this down here to inherit from the player class so it I hear player we type here name now as you can see the error disappears because now it's respecting the upper bound that we set we set up here which is T meaning games player has to inherit from the player class and down here it's inheriting so this is our discussion about how we can use generics and how we can use how you can Define upper bounds and in the next videos you're gonna look at um type erasures and you're going to lose what reified a keyword and how you can inline our function with because you need to inline your function when the use refine the keyword so see you in the next video well actually before I end the video I should say why this uh genetics is important why because if you think about because here you can type we can define a generic type we don't need to create um a separate class for for every team that that we want to use so we don't need to create a football team we don't need to create a separate baseball team we don't need to create a separate games team we we just create a team we Define the generic type T and here we pass our we pass our our type and in this way we can use only one class and we can we can have all of those uh those uh baseball team we can have the football team we can have just by having the the type here which is generic otherwise we'll have to create separate classes for each of those teams so see you in the next video and next video as I said we're gonna look at type erasers and refine the verified the keyword and the inline functions and in the next videos we're going to look also at covariance and counter variance so see in the next video