vals:String?=null// nullable type// Safe call — returns null instead of throwingvallen=s?.length// Int?// Elvis operator — provide a defaultvallen2=s?.length?:0// Int (0 if s is null)// Non-null assertion — throws NullPointerException if null (avoid!)vallen3=s!!.length// throws if s is null// Safe cast — returns null if cast failsvaln:Int?=someValueas?Int// Let — run a block only if non-nulls?.let{str->println("String is: $str")}// Null check with smart castif(s!=null){println(s.length)// s is smart-cast to String here}// Elvis with early return (common idiom)funprocess(input:String?){valsafe=input?:return// return early if nullprintln(safe.length)}
// Launch a fire-and-forget coroutinescope.launch{doWork()}// Launch and get a resultvaldeferred:Deferred<String>=scope.async{fetchData()}valresult=deferred.await()// Suspend functionsuspendfunfetchUser(id:Long):User{delay(100)// non-blocking sleepreturnapi.getUser(id)}// Run blocking (for tests or main functions)funmain()=runBlocking{valuser=fetchUser(1)println(user)}// Flow — cold asynchronous streamfunnumbers():Flow<Int>=flow{for(iin1..5){delay(100)emit(i)}}// Collect a flownumbers().collect{n->println(n)}// StateFlow — hot flow for state (Android ViewModels)privateval_uiState=MutableStateFlow(UiState.Loading)valuiState:StateFlow<UiState>=_uiState.asStateFlow()// Structured concurrencycoroutineScope{// waits for all childrenvala=async{computeA()}valb=async{computeB()}println(a.await()+b.await())}// DispatchersDispatchers.Main// Android main threadDispatchers.IO// I/O-optimized thread poolDispatchers.Default// CPU-intensive work
// Composable function — the building block of Compose UI@ComposablefunGreeting(name:String){Text(text="Hello, $name!")}// State in Composevarcountbyremember{mutableStateOf(0)}// or in a ViewModel:privateval_count=MutableStateFlow(0)valcount:StateFlow<Int>=_count.asStateFlow()// Collect StateFlow in ComposevalcountbyviewModel.count.collectAsStateWithLifecycle()// NavigationvalnavController=rememberNavController()NavHost(navController,startDestination="home"){composable("home"){HomeScreen(navController)}composable("detail/{id}"){backStackEntry->DetailScreen(backStackEntry.arguments?.getString("id"))}}navController.navigate("detail/42")// Hilt injection in ViewModel@HiltViewModelclassMyViewModel@Injectconstructor(privatevalrepository:MyRepository):ViewModel()// Room entity + DAO@Entity(tableName="users")dataclassUserEntity(@PrimaryKeyvalid:Long,valname:String)@DaointerfaceUserDao{@Query("SELECT * FROM users")fungetAll():Flow<List<UserEntity>>@Insert(onConflict=OnConflictStrategy.REPLACE)suspendfuninsert(user:UserEntity)}