[{"data":1,"prerenderedAt":994},["ShallowReactive",2],{"page-\u002Fkotlin\u002Fcoroutines-et-compose":3,"pieces-kotlin":952,"autour-\u002Fkotlin\u002Fcoroutines-et-compose":977,"prerequis-\u002Fkotlin\u002Fcoroutines-et-compose":981,"plan-kotlin":983},{"id":4,"title":5,"body":6,"description":926,"extension":927,"ligne":68,"meta":928,"motsCles":929,"navigation":131,"niveau":930,"path":931,"prerequis":932,"ressources":934,"seo":946,"sources":947,"stem":950,"__hash__":951},"docs\u002Fkotlin\u002F06.coroutines-et-compose.md","Coroutines et Jetpack Compose",{"type":7,"value":8,"toc":914},"minimark",[9,14,44,48,52,63,92,95,99,182,192,201,205,284,290,299,303,392,405,408,469,478,482,488,557,567,571,657,663,667,758,768,778,782,849,859,863,910],[10,11,13],"h2",{"id":12},"ce-que-tu-vas-apprendre","Ce que tu vas apprendre",[15,16,17,34,37],"ul",{},[18,19,20,21,25,26,29,30,33],"li",{},"Écrire une fonction ",[22,23,24],"code",{},"suspend"," et lancer des coroutines avec ",[22,27,28],{},"launch"," et ",[22,31,32],{},"async",".",[18,35,36],{},"Comprendre à quoi servent les coroutines dans une application.",[18,38,39,40,43],{},"Lire une fonction ",[22,41,42],{},"@Composable"," simple de Jetpack Compose.",[10,45,47],{"id":46},"pourquoi-des-coroutines","Pourquoi des coroutines",[49,50,51],"p",{},"Charger une recette depuis Internet prend du temps. Si le programme attend sans rien faire, l'écran se fige.",[49,53,54,55,59,60,33],{},"Une ",[56,57,58],"strong",{},"coroutine"," est une tâche qui peut se mettre en pause sans bloquer le reste du programme. Elle reprend quand le résultat est prêt. Les coroutines ne sont pas dans le langage seul : elles viennent de la bibliothèque ",[22,61,62],{},"kotlinx.coroutines",[64,65,70],"pre",{"className":66,"code":67,"language":68,"meta":69,"style":69},"language-kotlin shiki shiki-themes github-light-default github-dark-default github-dark-default","implementation(\"org.jetbrains.kotlinx:kotlinx-coroutines-core:1.11.0\")\n","kotlin","",[22,71,72],{"__ignoreMap":69},[73,74,77,81,85,89],"span",{"class":75,"line":76},"line",1,[73,78,80],{"class":79},"syCW7","implementation",[73,82,84],{"class":83},"scfrF","(",[73,86,88],{"class":87},"shWOn","\"org.jetbrains.kotlinx:kotlinx-coroutines-core:1.11.0\"",[73,90,91],{"class":83},")\n",[49,93,94],{},"Cette ligne s'ajoute dans le fichier de build Gradle de ton projet.",[10,96,98],{"id":97},"suspend-une-fonction-qui-peut-attendre","suspend : une fonction qui peut attendre",[64,100,102],{"className":66,"code":101,"language":68,"meta":69,"style":69},"import kotlinx.coroutines.*\nimport kotlin.time.Duration.Companion.seconds\n\nsuspend fun chargerRecette(): String {\n    delay(1.seconds)\n    return \"Tarte aux pommes\"\n}\n",[22,103,104,118,126,133,153,167,176],{"__ignoreMap":69},[73,105,106,110,114],{"class":75,"line":76},[73,107,109],{"class":108},"sOnC1","import",[73,111,113],{"class":112},"sIXEE"," kotlinx.coroutines.",[73,115,117],{"class":116},"s5iOY","*\n",[73,119,121,123],{"class":75,"line":120},2,[73,122,109],{"class":108},[73,124,125],{"class":112}," kotlin.time.Duration.Companion.seconds\n",[73,127,129],{"class":75,"line":128},3,[73,130,132],{"emptyLinePlaceholder":131},true,"\n",[73,134,136,138,141,144,147,150],{"class":75,"line":135},4,[73,137,24],{"class":108},[73,139,140],{"class":108}," fun",[73,142,143],{"class":79}," chargerRecette",[73,145,146],{"class":83},"(): ",[73,148,149],{"class":112},"String",[73,151,152],{"class":83}," {\n",[73,154,156,159,161,164],{"class":75,"line":155},5,[73,157,158],{"class":79},"    delay",[73,160,84],{"class":83},[73,162,163],{"class":116},"1",[73,165,166],{"class":83},".seconds)\n",[73,168,170,173],{"class":75,"line":169},6,[73,171,172],{"class":108},"    return",[73,174,175],{"class":87}," \"Tarte aux pommes\"\n",[73,177,179],{"class":75,"line":178},7,[73,180,181],{"class":83},"}\n",[49,183,184,185,187,188,191],{},"Le mot-clé ",[56,186,24],{}," marque une fonction qui peut être mise en pause. ",[22,189,190],{},"delay"," attend sans bloquer le fil d'exécution.",[49,193,194,195,197,198,200],{},"Une fonction ",[22,196,24],{}," ne peut être appelée que depuis une autre fonction ",[22,199,24],{}," ou depuis une coroutine.",[10,202,204],{"id":203},"coroutinescope-et-launch","coroutineScope et launch",[64,206,208],{"className":66,"code":207,"language":68,"meta":69,"style":69},"suspend fun main() {\n    coroutineScope {\n        launch { println(\"Pâte prête\") }\n        launch { println(\"Garniture prête\") }\n    }\n    println(\"Tout est prêt\")\n}\n",[22,209,210,222,229,248,263,268,280],{"__ignoreMap":69},[73,211,212,214,216,219],{"class":75,"line":76},[73,213,24],{"class":108},[73,215,140],{"class":108},[73,217,218],{"class":79}," main",[73,220,221],{"class":83},"() {\n",[73,223,224,227],{"class":75,"line":120},[73,225,226],{"class":79},"    coroutineScope",[73,228,152],{"class":83},[73,230,231,234,237,240,242,245],{"class":75,"line":128},[73,232,233],{"class":79},"        launch",[73,235,236],{"class":83}," { ",[73,238,239],{"class":79},"println",[73,241,84],{"class":83},[73,243,244],{"class":87},"\"Pâte prête\"",[73,246,247],{"class":83},") }\n",[73,249,250,252,254,256,258,261],{"class":75,"line":135},[73,251,233],{"class":79},[73,253,236],{"class":83},[73,255,239],{"class":79},[73,257,84],{"class":83},[73,259,260],{"class":87},"\"Garniture prête\"",[73,262,247],{"class":83},[73,264,265],{"class":75,"line":155},[73,266,267],{"class":83},"    }\n",[73,269,270,273,275,278],{"class":75,"line":169},[73,271,272],{"class":79},"    println",[73,274,84],{"class":83},[73,276,277],{"class":87},"\"Tout est prêt\"",[73,279,91],{"class":83},[73,281,282],{"class":75,"line":178},[73,283,181],{"class":83},[49,285,286,289],{},[22,287,288],{},"coroutineScope"," ouvre un espace où vivent des coroutines, et attend qu'elles aient toutes fini avant de continuer.",[49,291,292,294,295,298],{},[22,293,28],{}," démarre une nouvelle coroutine sans bloquer le reste. Elle renvoie un ",[22,296,297],{},"Job",", un identifiant de la tâche en cours.",[10,300,302],{"id":301},"async-et-await","async et await",[64,304,306],{"className":66,"code":305,"language":68,"meta":69,"style":69},"suspend fun main() = coroutineScope {\n    val titre = async { chargerTitre() }\n    val photo = async { chargerPhoto() }\n    println(\"${titre.await()} - ${photo.await()}\")\n}\n",[22,307,308,327,348,366,388],{"__ignoreMap":69},[73,309,310,312,314,316,319,322,325],{"class":75,"line":76},[73,311,24],{"class":108},[73,313,140],{"class":108},[73,315,218],{"class":79},[73,317,318],{"class":83},"() ",[73,320,321],{"class":108},"=",[73,323,324],{"class":79}," coroutineScope",[73,326,152],{"class":83},[73,328,329,332,335,337,340,342,345],{"class":75,"line":120},[73,330,331],{"class":108},"    val",[73,333,334],{"class":83}," titre ",[73,336,321],{"class":108},[73,338,339],{"class":79}," async",[73,341,236],{"class":83},[73,343,344],{"class":79},"chargerTitre",[73,346,347],{"class":83},"() }\n",[73,349,350,352,355,357,359,361,364],{"class":75,"line":128},[73,351,331],{"class":108},[73,353,354],{"class":83}," photo ",[73,356,321],{"class":108},[73,358,339],{"class":79},[73,360,236],{"class":83},[73,362,363],{"class":79},"chargerPhoto",[73,365,347],{"class":83},[73,367,368,370,372,375,378,381,383,386],{"class":75,"line":135},[73,369,272],{"class":79},[73,371,84],{"class":83},[73,373,374],{"class":87},"\"${titre.",[73,376,377],{"class":79},"await",[73,379,380],{"class":87},"()} - ${photo.",[73,382,377],{"class":79},[73,384,385],{"class":87},"()}\"",[73,387,91],{"class":83},[73,389,390],{"class":75,"line":155},[73,391,181],{"class":83},[49,393,394,396,397,400,401,404],{},[22,395,32],{}," lance un calcul concurrent et renvoie un ",[22,398,399],{},"Deferred",", une promesse de résultat. ",[22,402,403],{},"await()"," met en pause jusqu'à ce que la valeur soit prête.",[49,406,407],{},"Les deux chargements démarrent ensemble : le temps total est celui du plus long.",[409,410,411,427],"table",{},[412,413,414],"thead",{},[415,416,417,421,424],"tr",{},[418,419,420],"th",{},"Outil",[418,422,423],{},"Rôle",[418,425,426],{},"Renvoie",[428,429,430,444,457],"tbody",{},[415,431,432,437,440],{},[433,434,435],"td",{},[22,436,28],{},[433,438,439],{},"Lancer une tâche sans résultat",[433,441,442],{},[22,443,297],{},[415,445,446,450,453],{},[433,447,448],{},[22,449,32],{},[433,451,452],{},"Lancer un calcul avec résultat",[433,454,455],{},[22,456,399],{},[415,458,459,463,466],{},[433,460,461],{},[22,462,288],{},[433,464,465],{},"Regrouper et attendre des coroutines",[433,467,468],{},"Le résultat de son bloc",[470,471,472],"warning",{},[49,473,474,477],{},[22,475,476],{},"runBlocking"," bloque le fil courant jusqu'à la fin de son contenu. N'en fais pas ton réflexe.",[10,479,481],{"id":480},"jetpack-compose-en-un-coup-doeil","Jetpack Compose en un coup d'oeil",[49,483,484,487],{},[56,485,486],{},"Jetpack Compose"," est la boîte à outils moderne d'Android pour construire une interface avec des fonctions Kotlin. Au lieu de décrire l'écran dans un fichier séparé, tu l'écris en code.",[64,489,491],{"className":66,"code":490,"language":68,"meta":69,"style":69},"import androidx.compose.material3.Text\nimport androidx.compose.runtime.Composable\n\n@Composable\nfun CarteRecette(titre: String) {\n    Text(text = \"Recette : $titre\")\n}\n",[22,492,493,500,507,511,516,532,553],{"__ignoreMap":69},[73,494,495,497],{"class":75,"line":76},[73,496,109],{"class":108},[73,498,499],{"class":112}," androidx.compose.material3.Text\n",[73,501,502,504],{"class":75,"line":120},[73,503,109],{"class":108},[73,505,506],{"class":112}," androidx.compose.runtime.Composable\n",[73,508,509],{"class":75,"line":128},[73,510,132],{"emptyLinePlaceholder":131},[73,512,513],{"class":75,"line":135},[73,514,515],{"class":112},"@Composable\n",[73,517,518,521,524,527,529],{"class":75,"line":155},[73,519,520],{"class":108},"fun",[73,522,523],{"class":79}," CarteRecette",[73,525,526],{"class":83},"(titre: ",[73,528,149],{"class":112},[73,530,531],{"class":83},") {\n",[73,533,534,537,540,542,545,548,551],{"class":75,"line":169},[73,535,536],{"class":79},"    Text",[73,538,539],{"class":83},"(text ",[73,541,321],{"class":108},[73,543,544],{"class":87}," \"Recette : ",[73,546,547],{"class":116},"$titre",[73,549,550],{"class":87},"\"",[73,552,91],{"class":83},[73,554,555],{"class":75,"line":178},[73,556,181],{"class":83},[49,558,559,560,562,563,566],{},"Une fonction marquée ",[22,561,42],{}," décrit une partie de l'écran. ",[22,564,565],{},"Text"," est un composable fourni par la bibliothèque. Un composable ne peut être appelé que depuis un autre composable.",[10,568,570],{"id":569},"afficher-la-fonction-à-lécran","Afficher la fonction à l'écran",[64,572,574],{"className":66,"code":573,"language":68,"meta":69,"style":69},"class MainActivity : ComponentActivity() {\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        setContent {\n            CarteRecette(\"Tarte aux pommes\")\n        }\n    }\n}\n",[22,575,576,592,611,624,631,643,648,652],{"__ignoreMap":69},[73,577,578,581,584,587,590],{"class":75,"line":76},[73,579,580],{"class":108},"class",[73,582,583],{"class":112}," MainActivity",[73,585,586],{"class":83}," : ",[73,588,589],{"class":112},"ComponentActivity",[73,591,221],{"class":83},[73,593,594,597,599,602,605,608],{"class":75,"line":120},[73,595,596],{"class":108},"    override",[73,598,140],{"class":108},[73,600,601],{"class":79}," onCreate",[73,603,604],{"class":83},"(savedInstanceState: ",[73,606,607],{"class":112},"Bundle",[73,609,610],{"class":83},"?) {\n",[73,612,613,616,618,621],{"class":75,"line":128},[73,614,615],{"class":116},"        super",[73,617,33],{"class":83},[73,619,620],{"class":79},"onCreate",[73,622,623],{"class":83},"(savedInstanceState)\n",[73,625,626,629],{"class":75,"line":135},[73,627,628],{"class":79},"        setContent",[73,630,152],{"class":83},[73,632,633,636,638,641],{"class":75,"line":155},[73,634,635],{"class":79},"            CarteRecette",[73,637,84],{"class":83},[73,639,640],{"class":87},"\"Tarte aux pommes\"",[73,642,91],{"class":83},[73,644,645],{"class":75,"line":169},[73,646,647],{"class":83},"        }\n",[73,649,650],{"class":75,"line":178},[73,651,267],{"class":83},[73,653,655],{"class":75,"line":654},8,[73,656,181],{"class":83},[49,658,659,662],{},[22,660,661],{},"setContent"," définit le contenu d'une activité, c'est-à-dire d'un écran de l'application. C'est le point d'entrée de tes composables.",[10,664,666],{"id":665},"un-état-avec-remember","Un état avec remember",[64,668,670],{"className":66,"code":669,"language":68,"meta":69,"style":69},"@Composable\nfun Compteur() {\n    var portions by remember { mutableStateOf(4) }\n    Button(onClick = { portions += 1 }) {\n        Text(\"Portions : $portions\")\n    }\n}\n",[22,671,672,676,685,711,733,750,754],{"__ignoreMap":69},[73,673,674],{"class":75,"line":76},[73,675,515],{"class":112},[73,677,678,680,683],{"class":75,"line":120},[73,679,520],{"class":108},[73,681,682],{"class":79}," Compteur",[73,684,221],{"class":83},[73,686,687,690,693,696,699,701,704,706,709],{"class":75,"line":128},[73,688,689],{"class":108},"    var",[73,691,692],{"class":83}," portions ",[73,694,695],{"class":108},"by",[73,697,698],{"class":79}," remember",[73,700,236],{"class":83},[73,702,703],{"class":79},"mutableStateOf",[73,705,84],{"class":83},[73,707,708],{"class":116},"4",[73,710,247],{"class":83},[73,712,713,716,719,721,724,727,730],{"class":75,"line":135},[73,714,715],{"class":79},"    Button",[73,717,718],{"class":83},"(onClick ",[73,720,321],{"class":108},[73,722,723],{"class":83}," { portions ",[73,725,726],{"class":108},"+=",[73,728,729],{"class":116}," 1",[73,731,732],{"class":83}," }) {\n",[73,734,735,738,740,743,746,748],{"class":75,"line":155},[73,736,737],{"class":79},"        Text",[73,739,84],{"class":83},[73,741,742],{"class":87},"\"Portions : ",[73,744,745],{"class":116},"$portions",[73,747,550],{"class":87},[73,749,91],{"class":83},[73,751,752],{"class":75,"line":169},[73,753,267],{"class":83},[73,755,756],{"class":75,"line":178},[73,757,181],{"class":83},[49,759,760,761,764,765,767],{},"Un ",[56,762,763],{},"état"," est une valeur qui change au cours du temps. ",[22,766,703],{}," crée une valeur observable par Compose. Quand elle change, les composables qui la lisent sont redessinés.",[49,769,770,773,774,777],{},[22,771,772],{},"remember"," conserve la valeur entre deux redessins. Sans lui, ",[22,775,776],{},"portions"," repartirait de 4 à chaque fois.",[10,779,781],{"id":780},"une-liste-de-recettes","Une liste de recettes",[64,783,785],{"className":66,"code":784,"language":68,"meta":69,"style":69},"@Composable\nfun ListeRecettes(titres: List\u003CString>) {\n    LazyColumn {\n        items(titres) { titre ->\n            CarteRecette(titre)\n        }\n    }\n}\n",[22,786,787,791,812,819,830,837,841,845],{"__ignoreMap":69},[73,788,789],{"class":75,"line":76},[73,790,515],{"class":112},[73,792,793,795,798,801,804,807,809],{"class":75,"line":120},[73,794,520],{"class":108},[73,796,797],{"class":79}," ListeRecettes",[73,799,800],{"class":83},"(titres: ",[73,802,803],{"class":112},"List",[73,805,806],{"class":83},"\u003C",[73,808,149],{"class":112},[73,810,811],{"class":83},">) {\n",[73,813,814,817],{"class":75,"line":128},[73,815,816],{"class":79},"    LazyColumn",[73,818,152],{"class":83},[73,820,821,824,827],{"class":75,"line":135},[73,822,823],{"class":79},"        items",[73,825,826],{"class":83},"(titres) { titre ",[73,828,829],{"class":108},"->\n",[73,831,832,834],{"class":75,"line":155},[73,833,635],{"class":79},[73,835,836],{"class":83},"(titre)\n",[73,838,839],{"class":75,"line":169},[73,840,647],{"class":83},[73,842,843],{"class":75,"line":178},[73,844,267],{"class":83},[73,846,847],{"class":75,"line":654},[73,848,181],{"class":83},[49,850,851,854,855,858],{},[22,852,853],{},"LazyColumn"," affiche une liste verticale qui ne construit que les éléments visibles. Le bloc passé à ",[22,856,857],{},"items"," est une lambda, comme celles du cours précédent.",[10,860,862],{"id":861},"à-retenir","À retenir",[15,864,865,868,876,889,896,903],{},[18,866,867],{},"Une coroutine est une tâche qui peut se mettre en pause sans bloquer le programme.",[18,869,194,870,872,873,875],{},[22,871,24],{}," ne s'appelle que depuis une autre fonction ",[22,874,24],{}," ou une coroutine.",[18,877,878,880,881,883,884,886,887,33],{},[22,879,28],{}," lance sans résultat, ",[22,882,32],{}," renvoie un ",[22,885,399],{}," dont on lit la valeur avec ",[22,888,403],{},[18,890,891,893,894,33],{},[22,892,288],{}," attend la fin des coroutines qu'il contient ; évite ",[22,895,476],{},[18,897,194,898,900,901,33],{},[22,899,42],{}," décrit un morceau d'interface et s'affiche via ",[22,902,661],{},[18,904,905,29,907,909],{},[22,906,772],{},[22,908,703],{}," gardent un état et redessinent l'écran quand il change.",[911,912,913],"style",{},"html pre.shiki code .syCW7, html code.shiki .syCW7{--shiki-light:#8250DF;--shiki-default:#D2A8FF;--shiki-dark:#D2A8FF}html pre.shiki code .scfrF, html code.shiki .scfrF{--shiki-light:#1F2328;--shiki-default:#E6EDF3;--shiki-dark:#E6EDF3}html pre.shiki code .shWOn, html code.shiki .shWOn{--shiki-light:#0A3069;--shiki-default:#A5D6FF;--shiki-dark:#A5D6FF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sOnC1, html code.shiki .sOnC1{--shiki-light:#CF222E;--shiki-default:#FF7B72;--shiki-dark:#FF7B72}html pre.shiki code .sIXEE, html code.shiki .sIXEE{--shiki-light:#953800;--shiki-default:#FFA657;--shiki-dark:#FFA657}html pre.shiki code .s5iOY, html code.shiki .s5iOY{--shiki-light:#0550AE;--shiki-default:#79C0FF;--shiki-dark:#79C0FF}",{"title":69,"searchDepth":120,"depth":128,"links":915},[916,917,918,919,920,921,922,923,924,925],{"id":12,"depth":120,"text":13},{"id":46,"depth":120,"text":47},{"id":97,"depth":120,"text":98},{"id":203,"depth":120,"text":204},{"id":301,"depth":120,"text":302},{"id":480,"depth":120,"text":481},{"id":569,"depth":120,"text":570},{"id":665,"depth":120,"text":666},{"id":780,"depth":120,"text":781},{"id":861,"depth":120,"text":862},"Lancer des tâches en parallèle avec les coroutines (suspend, launch, async), puis découvrir Jetpack Compose avec des fonctions @Composable.","md",{},[58,24,28,32,190,486,42,772],"avance","\u002Fkotlin\u002Fcoroutines-et-compose",[933],"\u002Fkotlin\u002Fcollections-et-lambdas",[935,939,943],{"nom":936,"url":937,"type":938},"Tutoriel Jetpack Compose","https:\u002F\u002Fdeveloper.android.com\u002Fdevelop\u002Fui\u002Fcompose\u002Ftutorial?hl=fr","doc",{"nom":940,"url":941,"type":942},"Principes de base d'Android avec Compose","https:\u002F\u002Fdeveloper.android.com\u002Fcourses\u002Fandroid-basics-compose\u002Fcourse?hl=fr","cours",{"nom":944,"url":945,"type":938,"anglais":131},"Coroutines basics (en anglais)","https:\u002F\u002Fkotlinlang.org\u002Fdocs\u002Fcoroutines-basics.html",{"title":5,"description":926},[948,949],{"nom":944,"url":945},{"nom":936,"url":937},"kotlin\u002F06.coroutines-et-compose","Vi4CzuCvEbIfrGdTc_v_37meFWwZXo2l2ARXEV5-Af8",[953,957,961,965,969,972,973],{"path":954,"title":955,"stem":956},"\u002Fkotlin\u002Fdecouvrir-kotlin","Découvrir Kotlin","kotlin\u002F01.decouvrir-kotlin",{"path":958,"title":959,"stem":960},"\u002Fkotlin\u002Fconditions-boucles-fonctions","Conditions, boucles et fonctions","kotlin\u002F02.conditions-boucles-fonctions",{"path":962,"title":963,"stem":964},"\u002Fkotlin\u002Fsecurite-du-null","La sécurité du null","kotlin\u002F03.securite-du-null",{"path":966,"title":967,"stem":968},"\u002Fkotlin\u002Fclasses-et-objets","Classes, data classes et objets","kotlin\u002F04.classes-et-objets",{"path":933,"title":970,"stem":971},"Collections et lambdas","kotlin\u002F05.collections-et-lambdas",{"path":931,"title":5,"stem":950},{"path":974,"title":975,"stem":976},"\u002Fkotlin","Kotlin","kotlin\u002Findex",[978,980],{"title":970,"path":933,"stem":971,"description":979,"children":-1},"Manipuler des listes, ensembles et dictionnaires, puis les transformer avec des lambdas comme map et filter, sur le thème des recettes.",null,[982],{"path":933,"title":970,"ligne":68},[984,986,987,988,990,991,992],{"path":954,"title":955,"niveau":985,"stem":956},"debutant",{"path":958,"title":959,"niveau":985,"stem":960},{"path":962,"title":963,"niveau":985,"stem":964},{"path":966,"title":967,"niveau":989,"stem":968},"intermediaire",{"path":933,"title":970,"niveau":989,"stem":971},{"path":931,"title":5,"niveau":930,"stem":950},{"path":974,"title":975,"niveau":993,"stem":976},"memo",1794583462340]