{"product_id":"110072","title":"Kotlin en action 2e édition ","description":"\u003ccenter\u003e\u003cdiv style=\"text-align:center\"\u003e\u003cimg src=\"https:\/\/tmgdisk01.cafe24.com\/images\/vs\/4172\/sv\/3jYEEOP7gyiWlOpXGYQnlsmHW9YENV.png?v=1765094480\" style=\"max-width:100%;max-height:10px\"\u003e\u003c\/div\u003e\u003c\/center\u003e\n\u003ccenter\u003e\u003ctable\u003e\u003ctr\u003e\u003ctd style=\"height:10px\"\u003e\u003c\/td\u003e\u003c\/tr\u003e\u003c\/table\u003e\u003c\/center\u003e\n\u003ccenter\u003e\u003ctable\u003e\u003ctr\u003e\u003ctd style=\"height:10px\"\u003e\u003c\/td\u003e\u003c\/tr\u003e\u003c\/table\u003e\u003c\/center\u003e\n\u003ccenter\u003e\n\n\u003cdiv style=\"width:95%\"\u003e\n\n \u003cdiv style=\"text-align:center;font-size:30px;font-weight:bolder;line-height:1.6em\"\u003eKotlin en action 2e édition \u003c\/div\u003e\n\n\u003ccenter\u003e\u003ctable\u003e\u003ctr\u003e\u003ctd style=\"height:10px\"\u003e\u003c\/td\u003e\u003c\/tr\u003e\u003c\/table\u003e\u003c\/center\u003e\n\n\u003ccenter\u003e\u003ctable\u003e\u003ctr\u003e\u003ctd style=\"height:10px\"\u003e\u003c\/td\u003e\u003c\/tr\u003e\u003c\/table\u003e\u003c\/center\u003e\n\n\u003ccenter\u003e\u003ctable\u003e\u003ctr\u003e\u003ctd style=\"height:10px\"\u003e\u003c\/td\u003e\u003c\/tr\u003e\u003c\/table\u003e\u003c\/center\u003e\n\n\u003ccenter\u003e\u003ctable\u003e\u003ctr\u003e\u003ctd style=\"height:10px\"\u003e\u003c\/td\u003e\u003c\/tr\u003e\u003c\/table\u003e\u003c\/center\u003e\n\n\u003cdiv style=\"border-bottom:1px;border-bottom-style:dotted;border-color:;padding-bottom:20px\"\u003e\u003ccenter\u003e\u003ctable align=\"center\" width=\"100%\"\u003e\u003ctbody style=\"border:0px\"\u003e\n\n\u003ctr\u003e\u003ctd align=\"center\" style=\"line-height:1.2em;text-align:center;font-size:18px;color:black;font-weight:bold;padding-bottom:20px;\"\u003e\u003c\/td\u003e\u003c\/tr\u003e\n\n\u003ctr\u003e\u003ctd style=\"text-align:center\"\u003e\u003cimg src=\"https:\/\/image.yes24.com\/goods\/142690359\/XL\" style=\"max-width:100%;height:auto\"\u003e\u003c\/td\u003e\u003c\/tr\u003e\n\n\n\u003c\/tbody\u003e\u003c\/table\u003e\u003c\/center\u003e\u003c\/div\u003e\n\n\u003ccenter\u003e\u003ctable\u003e\u003ctr\u003e\u003ctd style=\"height:10px\"\u003e\u003c\/td\u003e\u003c\/tr\u003e\u003c\/table\u003e\u003c\/center\u003e\n\n\u003ccenter\u003e\u003ctable\u003e\u003ctr\u003e\u003ctd style=\"height:10px\"\u003e\u003c\/td\u003e\u003c\/tr\u003e\u003c\/table\u003e\u003c\/center\u003e\n\n\u003cdiv style=\"width:95%;{split_style6}padding-top:20px;padding-bottom:20px\"\u003e\n\n\u003cdiv style=\"text-align:left;font-size:16px;font-weight:bold;padding-bottom:20px\"\u003e Description \u003c\/div\u003e\n\n\u003cdiv style=\"text-align:left;word-break:break-all;font-size:14px;line-height:1.6em;\"\u003e\n\n\u003cdiv\u003e\u003ch5\u003e \u003cb\u003eIntroduction au livre\u003c\/b\u003e\n\u003c\/h5\u003e\u003c\/div\u003e\n\u003cdiv\u003e\n\u003cdiv\u003e\u003cdiv\u003e Kotlin, le langage officiel d'Android, est de plus en plus utilisé dans divers domaines, notamment la programmation serveur, en raison de sa praticité, de sa simplicité et de son interopérabilité avec Java.\u003cbr\u003e La principale caractéristique du langage Kotlin est son aspect pratique.\u003cbr\u003e Ce livre a également été écrit dans une perspective qui met l'accent sur l'aspect pratique, et peut être considéré comme une sorte de livre officiel écrit directement par les développeurs du compilateur Kotlin chez JetBrains, qui ont développé le langage Kotlin.\u003cbr\u003e Cet ouvrage, qui fait office de référence de facto pour Kotlin depuis sa première édition en 2017, en est maintenant à sa deuxième édition, révisée pour Kotlin 2.0.\u003cbr\u003e\u003cbr\u003e\u003cbr\u003e Ce livre présente les bases de Kotlin et explique l'orientation objet, les génériques, les fonctions d'ordre supérieur et la programmation fonctionnelle, ainsi que l'utilisation de la bibliothèque de collections standard. \u003cbr\u003eNous allons ici expliquer en détail comment Kotlin a amélioré le langage Java et à quoi faire attention lorsqu'on utilise Kotlin avec des projets Java existants.\u003cbr\u003e La seconde partie détaille les techniques de conception et d'implémentation, en présentant des exemples concrets de bibliothèques d'annotations, de réflexion, de DSL et de programmation asynchrone (fonctions de suspension, coroutines et flux).\u003cbr\u003e\n\u003c\/div\u003e\u003c\/div\u003e\n\u003cdiv\u003e\u003cul\u003e\u003cli\u003e Vous pouvez consulter un aperçu du contenu du livre.\u003cbr\u003e \u003cspan\u003eAperçu\u003c\/span\u003e\n\n\u003c\/li\u003e\u003c\/ul\u003e\u003c\/div\u003e\n\u003c\/div\u003e\n\u003cbr\u003e\u003cdiv\u003e\u003ch5\u003e \u003cb\u003eindice\u003c\/b\u003e\n\u003c\/h5\u003e\u003c\/div\u003e\n\u003cdiv\u003e\n\u003cdiv\u003e \u003cb\u003ePartie 1 : Introduction à Kotlin\u003c\/b\u003e\u003cbr\u003e\u003cbr\u003e \u003cb\u003eChapitre 1 : Qu’est-ce que Kotlin et pourquoi en ai-je besoin ?\u003c\/b\u003e\u003cbr\u003e\u003cbr\u003e 1.1 Un aperçu de Kotlin\u003cbr\u003e 1.2 Principales caractéristiques de Kotlin\u003cbr\u003e 1.2.1 Cas d'utilisation de Kotlin : Android, serveurs, environnements d'exécution Java, et plus encore\u003cbr\u003e 1.2.2 Les performances, la fiabilité et la maintenabilité de Kotlin sont toutes bonnes grâce au typage statique.\u003cbr\u003e Azim\u003cbr\u003e 1.2.3 La combinaison de la programmation fonctionnelle et de la programmation orientée objet rend Kotlin sûr et\u003cbr\u003e Soyez flexible \u003cbr\u003e1.2.4 Les coroutines vous permettent d'écrire du code concurrent et asynchrone de manière naturelle et structurée.\u003cbr\u003e il y a\u003cbr\u003e 1.2.5 Kotlin peut être utilisé à toutes fins.\u003cbr\u003e Kotlin est un logiciel libre, et vous\u003cbr\u003e est ouvert aux contributions\u003cbr\u003e 1.3 Domaines d'utilisation fréquente de Kotlin\u003cbr\u003e 1.3.1 Support du backend : Programmation serveur Kotlin\u003cbr\u003e 1.3.2 Développement mobile : Android privilégie Kotlin\u003cbr\u003e 1.3.3 Multiplateforme : Partagez la logique métier entre iOS, JVM, JS et d'autres plateformes.\u003cbr\u003e Réduisez au minimum la duplication et l'ambiguïté du code\u003cbr\u003e 1.4 La philosophie de Kotlin\u003cbr\u003e 1.4.1 Kotlin est un langage pratique\u003cbr\u003e 1.4.2 Kotlin est concis\u003cbr\u003e 1.4.3 Kotlin est sûr\u003cbr\u003e 1.4.4 Kotlin est interopérable\u003cbr\u003e 1.5 Utilisation des outils Kotlin\u003cbr\u003e 1.5.1 Configuration et exécution du code Kotlin\u003cbr\u003e 1.5.2 Compilation du code Kotlin\u003cbr\u003e addition\u003cbr\u003e\u003cbr\u003e \u003cb\u003eChapitre 2 : Les bases de Kotlin\u003c\/b\u003e\u003cbr\u003e\u003cbr\u003e 2.1 Éléments de base : Fonctions et variables\u003cbr\u003e 2.1.1 Écrire votre premier programme Kotlin : Bonjour, monde !\u003cbr\u003e 2.1.2 Déclaration d'une fonction avec paramètres et valeurs de retour \u003cbr\u003e2.1.3 Définition plus concise des fonctions à l'aide de corps d'expression\u003cbr\u003e 2.1.4 Déclarer des variables pour stocker les données\u003cbr\u003e 2.1.5 Marquage des variables comme étant en lecture seule ou réassignables\u003cbr\u003e 2.1.6 Formatage simplifié des chaînes de caractères : modèles de chaînes\u003cbr\u003e 2.2 Comportement et encapsulation des données : classes et propriétés\u003cbr\u003e 2.2.1 Association des classes aux données et leur accessibilité : propriétés\u003cbr\u003e 2.2.2 Calcul des valeurs des propriétés sans les stocker : Accesseurs personnalisés\u003cbr\u003e 2.2.3 Structure du code source Kotlin : répertoires et packages\u003cbr\u003e 2.3 Expressions de sélection et traitement : inum et when\u003cbr\u003e 2.3.1 Définitions des classes et constantes d'énumération\u003cbr\u003e 2.3.2 Gestion des classes énumérées avec when\u003cbr\u003e 2.3.3 Capture de la cible de l'expression when dans une variable\u003cbr\u003e 2.3.4 Utilisation d'objets arbitraires dans les conditions de branchement when\u003cbr\u003e 2.3.5 Utilisation sans arguments\u003cbr\u003e 2.3.6 Conversion intelligente : combinaison de la vérification de type et de la conversion de type\u003cbr\u003e 2.3.7 Refactorisation : Remplacer « if » par « when »\u003cbr\u003e 2.3.8 Utilisation des blocs dans les branches if et when\u003cbr\u003e 2.4 Itération cible : boucles while et for \u003cbr\u003e2.4.1 Répéter du code tant qu'une condition est vraie : la boucle while\u003cbr\u003e 2.4.2 Itération sur les nombres : intervalles et permutations\u003cbr\u003e 2.4.3 Itération sur la carte\u003cbr\u003e 2.4.4 Inspection des éléments d'une collection ou d'une plage dans\u003cbr\u003e 2.5 Gestion des exceptions en Kotlin\u003cbr\u003e 2.5.1 Gestion des exceptions et récupération des erreurs à l'aide de try, catch et finally\u003cbr\u003e 2.5.2 Utilisation de try comme expression\u003cbr\u003e addition\u003cbr\u003e\u003cbr\u003e \u003cb\u003eChapitre 3 Définition et appel de fonctions\u003c\/b\u003e\u003cbr\u003e\u003cbr\u003e 3.1 Création de collections en Kotlin\u003cbr\u003e 3.2 Faciliter l'appel des fonctions\u003cbr\u003e 3.2.1 Arguments nommés\u003cbr\u003e 3.2.2 Valeurs des paramètres par défaut\u003cbr\u003e 3.2.3 Élimination des classes utilitaires statiques : fonctions et propriétés de niveau supérieur\u003cbr\u003e 3.3 Ajout de méthodes à d'autres classes : fonctions d'extension et propriétés d'extension\u003cbr\u003e 3.3.1 Fonctions d'importation et d'extension\u003cbr\u003e 3.3.2 Appel de fonctions d'extension depuis Java\u003cbr\u003e 3.3.3 Définition des fonctions utilitaires comme fonctions d'extension\u003cbr\u003e 3.3.4 Les fonctions d'extension ne peuvent pas être surchargées\u003cbr\u003e 3.3.5 Propriétés de l'extension\u003cbr\u003e 3.4 Gestion des collections : arguments de longueur variable, appels de fonctions infixes et prise en charge des bibliothèques\u003cbr\u003e 3.4.1 Extensions de l'API Java Collection \u003cbr\u003e3.4.2 Fonctions variadiques : définition de fonctions pouvant avoir un nombre variable d’arguments\u003cbr\u003e 3.4.3 Gestion des paires (tuples) : appels infixes et déclarations de déstructuration\u003cbr\u003e 3.5 Gestion des chaînes de caractères et des expressions régulières\u003cbr\u003e 3.5.1 Division des cordes\u003cbr\u003e 3.5.2 Expressions régulières et chaînes de caractères entre triples guillemets\u003cbr\u003e 3.5.3 Chaînes multilignes entre triples guillemets\u003cbr\u003e 3.6 Nettoyage du code : fonctions locales et extensions\u003cbr\u003e addition\u003cbr\u003e\u003cbr\u003e \u003cb\u003eChapitre 4 Classes, objets et interfaces\u003c\/b\u003e\u003cbr\u003e\u003cbr\u003e 4.1 Définition de la hiérarchie des classes\u003cbr\u003e 4.1.1 Interfaces Kotlin\u003cbr\u003e 4.1.2 Modificateurs open, final et abstract : final par défaut\u003cbr\u003e 4.1.3 Modificateur de visibilité : public par défaut\u003cbr\u003e 4.1.4 Classes internes et imbriquées : Classes imbriquées par défaut\u003cbr\u003e 4.1.5 Classes scellées : définition d’une hiérarchie de classes avec des extensions restreintes\u003cbr\u003e 4.2 Déclaration d'une classe avec des constructeurs ou des propriétés non évidents\u003cbr\u003e 4.2.1 Initialisation de la classe : constructeur principal et bloc d’initialisation\u003cbr\u003e 4.2.2 Constructeurs secondaires : Initialisation de la superclasse d’une manière différente\u003cbr\u003e 4.2.3 Implémentation des propriétés déclarées dans une interface \u003cbr\u003e4.2.4 Accès aux champs gérés par des accesseurs et des mutateurs\u003cbr\u003e 4.2.5 Modification de la visibilité d'un accesseur\u003cbr\u003e 4.3 Méthodes générées par le compilateur : classes de données et délégation de classes\u003cbr\u003e 4.3.1 Méthodes que chaque classe doit définir\u003cbr\u003e 4.3.2 Classes de données : Générer automatiquement les méthodes que chaque classe doit définir.\u003cbr\u003e 4.4 Mot-clé object : Déclarez une classe et créez une instance simultanément.\u003cbr\u003e 4.4.1 Déclaration d'objet : Créer facilement des singletons\u003cbr\u003e 4.4.2 Objets compagnons : emplacement des méthodes de fabrique et des membres statiques\u003cbr\u003e 4.4.3 Utilisation d'objets compagnons comme objets ordinaires\u003cbr\u003e 4.4.4 Expressions d'objets : Écriture d'alternatives aux classes internes anonymes\u003cbr\u003e 4.5 Ajout de la sécurité typographique sans frais supplémentaires : classes en ligne\u003cbr\u003e addition\u003cbr\u003e\u003cbr\u003e \u003cb\u003eChapitre 5 : Programmation avec Lambda\u003c\/b\u003e\u003cbr\u003e\u003cbr\u003e 5.1 Expressions lambda et références de membres\u003cbr\u003e 5.1.1 Introduction aux lambdas : traiter les blocs de code comme des valeurs\u003cbr\u003e 5.1.2 Lambdas et collections\u003cbr\u003e 5.1.3 Grammaire des expressions lambda\u003cbr\u003e 5.1.4 Accéder aux variables dans la portée actuelle\u003cbr\u003e 5.1.5 Référence du membre\u003cbr\u003e 5.1.6 Références appelables associées aux valeurs \u003cbr\u003e5.2 Utilisation des interfaces fonctionnelles de Java : méthode abstraite unique\u003cbr\u003e 5.2.1 Passage de lambdas comme paramètres aux méthodes Java\u003cbr\u003e 5.2.2 Conversion SAM : Conversion explicite des lambdas en interfaces fonctionnelles\u003cbr\u003e 5.3 Définition d'une interface SAM en Kotlin : interface amusante\u003cbr\u003e 5.4 Expressions lambda pour spécifier les objets récepteurs : with, apply, also\u003cbr\u003e 5.4.1 avec fonction\u003cbr\u003e 5.4.2 Fonction d'application\u003cbr\u003e 5.4.3 Exécution d'opérations supplémentaires sur les objets : également\u003cbr\u003e addition\u003cbr\u003e\u003cbr\u003e \u003cb\u003eChapitre 6 Collections et séquences\u003c\/b\u003e\u003cbr\u003e\u003cbr\u003e 6.1 API fonctionnelle pour les collections\u003cbr\u003e 6.1.1 Suppression et transformation d'éléments : filtrage et mappage\u003cbr\u003e 6.1.2 Cumul des valeurs de collection : réduction et repliement\u003cbr\u003e 6.1.3 Application des prédicats aux collections : all, any, none, count, find\u003cbr\u003e 6.1.4 Partitionnement d'une liste en paires de listes : partition\u003cbr\u003e 6.1.5 Conversion d'une liste en une carte de plusieurs groupes : groupBy\u003cbr\u003e 6.1.6 Conversion d'une collection en map : associate, associateWith, associateBy\u003cbr\u003e 6.1.7 Modification des éléments d'une collection mutable : replaceAll, fill\u003cbr\u003e 6.1.8 Gestion des cas particuliers dans les collections : ifEmpty\u003cbr\u003e 6.1.9 Fractionnement d'une collection : par blocs et par fenêtres\u003cbr\u003e 6.1.10 Fusion de collections : zip \u003cbr\u003e6.1.11 Manipulation des éléments de collections imbriquées : flatMap et flatten\u003cbr\u003e 6.2 Opérations de collecte paresseuses : séquences\u003cbr\u003e 6.2.1 Exécution des opérations séquentielles : opérations intermédiaires et finales\u003cbr\u003e 6.2.2 Création d'une séquence\u003cbr\u003e addition\u003cbr\u003e\u003cbr\u003e \u003cb\u003eChapitre 7 : Valeurs pouvant être nulles\u003c\/b\u003e\u003cbr\u003e\u003cbr\u003e 7.1 Éviter l'exception NullPointerException et gérer l'absence de valeurs : la possibilité de valeurs nulles\u003cbr\u003e 7.2 Spécifier une variable pouvant être nulle comme un type pouvant être nul\u003cbr\u003e 7.3 Un examen plus approfondi de la signification des types\u003cbr\u003e 7.4 Combinaison de la vérification des valeurs nulles et des appels de méthode avec l'opérateur d'appel sécurisé : ?.\u003cbr\u003e 7.5 Attribuer une valeur par défaut à la valeur nulle avec l'opérateur Elvis : ?:\u003cbr\u003e 7.6 Conversion de types en toute sécurité sans lever d'exceptions : comme ?\u003cbr\u003e 7.7 Ce n'est pas votre affirmation : !!\u003cbr\u003e 7.8 fonction let\u003cbr\u003e 7.9 Types non nuls qui ne sont pas initialisés directement : propriétés d’initialisation paresseuse\u003cbr\u003e 7.10 Extensions de type sans opérateurs d'appel sécurisés : Extensions aux types nullables\u003cbr\u003e 7.11 Nullité des paramètres de type\u003cbr\u003e 7.12 Possibilité nulle et Java\u003cbr\u003e 7.12.1 Type de plateforme\u003cbr\u003e 7.12.2 Héritage\u003cbr\u003e addition\u003cbr\u003e \u003cbr\u003e\u003cb\u003eChapitre 8 Types de base, collections et tableaux\u003c\/b\u003e\u003cbr\u003e\u003cbr\u003e 8.1 Types primitifs et de base\u003cbr\u003e 8.1.1 Représentation des entiers, des nombres à virgule flottante, des caractères et des valeurs booléennes sous forme de types primitifs\u003cbr\u003e 8.1.2 Utilisation de toute la plage de bits pour représenter les nombres positifs : types de nombres non signés\u003cbr\u003e 8.1.3 Types primitifs pouvant être nuls : Int?, Boolean?, etc.\u003cbr\u003e 8.1.4 Conversion de nombres\u003cbr\u003e 8.1.5 Any et Any ? : Les racines de la hiérarchie des types de Kotlin\u003cbr\u003e 8.1.6 Type d'unité : Vide de Kotlin\u003cbr\u003e 8.1.7 Type Nothing : Cette fonction ne renvoie jamais de valeur.\u003cbr\u003e 8.2 Collections et tableaux\u003cbr\u003e 8.2.1 Collections de valeurs pouvant être nulles et collections pouvant être nulles\u003cbr\u003e 8.2.2 Collections en lecture seule et modifiables\u003cbr\u003e 8.2.3 Les collections Kotlin et les collections Java sont étroitement liées.\u003cbr\u003e 8.2.4 Les collections déclarées en Java apparaissent comme des types de plateforme en Kotlin.\u003cbr\u003e 8.2.5 Création de tableaux d'objets ou de tableaux de types primitifs pour optimiser les performances et l'interopérabilité\u003cbr\u003e addition\u003cbr\u003e\u003cbr\u003e \u003cb\u003ePartie 2 : Utiliser Kotlin à la manière de Kotlin\u003c\/b\u003e\u003cbr\u003e\u003cbr\u003e \u003cb\u003eChapitre 9 Surcharge de l'opérateur et autres conventions\u003c\/b\u003e\u003cbr\u003e \u003cbr\u003e9.1 Surcharge des opérateurs arithmétiques pour faciliter les opérations sur des classes arbitraires\u003cbr\u003e 9.1.1 Plus, multiplication, division, etc. : Surcharge des opérations arithmétiques binaires\u003cbr\u003e 9.1.2 Application d'une opération puis affectation directe du résultat : surcharge de l'opérateur d'affectation composée\u003cbr\u003e Ding\u003cbr\u003e 9.1.3 Opérateurs à un seul opérande : surcharge d’opérateur unaire\u003cbr\u003e 9.2 Vérifiez facilement les relations entre les objets en surchargeant les opérateurs de comparaison.\u003cbr\u003e 9.2.1 Opérateur d'égalité : égale\u003cbr\u003e 9.2.2 Opérateurs d'ordre : compareTo (〈, 〉, 〈=, 〉=)\u003cbr\u003e 9.3 Conventions pour la rédaction des descriptions de collections et de gammes\u003cbr\u003e 9.3.1 Accès aux éléments par index : get et set\u003cbr\u003e 9.3.2 Vérification de l'appartenance d'un objet à une collection : la convention « in »\u003cbr\u003e 9.3.3 Création de plages à partir d'objets : les conventions rangeTo et rangeUntil\u003cbr\u003e 9.3.4 Boucle sur votre propre type : la convention d’itération\u003cbr\u003e 9.4 Fourniture de déclarations de déstructuration à l'aide de fonctions de composants\u003cbr\u003e 9.4.1 Déstructuration des déclarations et des boucles\u003cbr\u003e 9.4.2 _ Ignorer les valeurs de déstructuration utilisant des caractères \u003cbr\u003e9.5 Réutilisation de la logique d'accès aux propriétés : propriétés déléguées\u003cbr\u003e 9.5.1 Syntaxe de base et fonctionnement interne des propriétés déléguées\u003cbr\u003e 9.5.2 Utilisation des propriétés déléguées : Initialisation paresseuse avec lazy()\u003cbr\u003e 9.5.3 Implémentation des propriétés déléguées\u003cbr\u003e 9.5.4 Les propriétés déléguées sont converties en propriétés cachées avec des accesseurs personnalisés.\u003cbr\u003e 9.5.5 Accès dynamique aux attributs par délégation à une carte\u003cbr\u003e 9.5.6 Comment les frameworks du monde réel utilisent les propriétés déléguées\u003cbr\u003e addition\u003cbr\u003e\u003cbr\u003e \u003cb\u003eChapitre 10 Fonctions d'ordre supérieur : Utilisation des lambdas comme paramètres et valeurs de retour\u003c\/b\u003e\u003cbr\u003e\u003cbr\u003e 10.1 Définition de fonctions qui prennent d'autres fonctions comme arguments ou qui renvoient d'autres fonctions : Fonctions d'ordre supérieur\u003cbr\u003e 10.1.1 Le type de fonction spécifie les types de paramètres et le type de retour de la lambda.\u003cbr\u003e 10.1.2 Appel d'une fonction passée en argument\u003cbr\u003e 10.1.3 Utilisation des types de fonctions Kotlin en Java\u003cbr\u003e 10.1.4 Vous pouvez spécifier des valeurs par défaut pour les paramètres de type fonction, et celles-ci peuvent être nulles.\u003cbr\u003e il y a\u003cbr\u003e 10.1.5 Retourner une fonction depuis une autre fonction\u003cbr\u003e 10.1.6 Utilisation de Lambda pour réduire la duplication et accroître la réutilisabilité du code \u003cbr\u003e10.2 Éliminer la surcharge des lambdas en utilisant des fonctions en ligne\u003cbr\u003e 10.2.1 Fonctionnement de l'intégration en ligne\u003cbr\u003e 10.2.2 Restrictions relatives aux fonctions en ligne\u003cbr\u003e 10.2.3 Opération de collecte en ligne\u003cbr\u003e 10.2.4 Déterminer quand déclarer une fonction en ligne\u003cbr\u003e 10.2.5 Utilisation des lambdas intégrées pour la gestion des ressources avec withLock, use et useLines\u003cbr\u003e 10.3 Retour des lambdas : Contrôle du flux dans les fonctions d’ordre supérieur\u003cbr\u003e 10.3.1 Instruction de retour dans une lambda : Retour de la fonction englobant la lambda\u003cbr\u003e 10.3.2 Retour depuis Lambdas : Retour avec étiquettes\u003cbr\u003e 10.3.3 Fonctions anonymes : retour local par défaut\u003cbr\u003e addition\u003cbr\u003e\u003cbr\u003e \u003cb\u003eChapitre 11 Génériques\u003c\/b\u003e\u003cbr\u003e\u003cbr\u003e 11.1 Création de types acceptant des arguments de type : paramètres de type générique\u003cbr\u003e 11.1.1 Fonctions et propriétés qui fonctionnent avec des types génériques\u003cbr\u003e 11.1.2 Déclarer une classe générique en utilisant la syntaxe des crochets\u003cbr\u003e 11.1.3 Limitation des types utilisables par les classes ou fonctions génériques : restrictions relatives aux types des paramètres\u003cbr\u003e environ \u003cbr\u003e11.1.4 Exclusion des arguments de type nullables en marquant explicitement les paramètres de type comme non nullables\u003cbr\u003e 11.2 Comportement des génériques d'exécution : paramètres de type effacés et réifiés\u003cbr\u003e 11.2.1 Limitations lors de la recherche d'informations de type pour les classes génériques à l'exécution : vérification de type et\u003cbr\u003e Fonderie\u003cbr\u003e 11.2.2 Une fonction qui utilise un paramètre de type instancié renvoie l'argument de type au moment de l'exécution.\u003cbr\u003e peut être mentionné\u003cbr\u003e 11.2.3 Remplacement des références de classe par des paramètres de type instancié dans java.lang.Class\u003cbr\u003e Éviter les paramètres\u003cbr\u003e 11.2.4 Définition des accesseurs avec des paramètres de type réifiés\u003cbr\u003e 11.2.5 Contraintes sur les paramètres de type matérialisé\u003cbr\u003e 11.3 La variance décrit la relation de sous-type entre un générique et ses arguments de type.\u003cbr\u003e 11.3.1 La variance nous permet de déterminer s’il est sûr de passer des arguments à une fonction.\u003cbr\u003e 11.3.2 Classes, types et sous-types\u003cbr\u003e 11.3.3 La covariance préserve les relations de sous-type \u003cbr\u003e11.3.4 La contravariance inverse les relations de sous-typage\u003cbr\u003e 11.3.5 Spécification de la variance au point où un type est mentionné à l'aide de la variance au point d'utilisation\u003cbr\u003e 11.3.6 Projection en étoile : Utilisation de * pour indiquer qu’il n’existe aucune information concernant un argument de type générique\u003cbr\u003e 11.3.7 Alias ​​de type\u003cbr\u003e addition\u003cbr\u003e\u003cbr\u003e \u003cb\u003eChapitre 12 Annotations et réflexions\u003c\/b\u003e\u003cbr\u003e\u003cbr\u003e 12.1 Déclaration et application des annotations\u003cbr\u003e 12.1.1 Annoter les déclarations\u003cbr\u003e 12.1.2 Spécification des déclarations exactes auxquelles une annotation peut faire référence : Cibles d’annotation\u003cbr\u003e 12.1.3 Contrôle de la sérialisation JSON à l'aide d'annotations\u003cbr\u003e 12.1.4 Déclaration d'annotation\u003cbr\u003e 12.1.5 Métaannotations : Contrôle du traitement des annotations\u003cbr\u003e 12.1.6 Utilisation des classes comme paramètres d'annotation\u003cbr\u003e 12.1.7 Réception d'une classe générique en tant que paramètre d'annotation\u003cbr\u003e 12.2 Réflexion : Observation des objets Kotlin à l’exécution\u003cbr\u003e 12.2.1 API de réflexion Kotlin : KClass, KCallable, KFunction, KProperty\u003cbr\u003e 12.2.2 Implémentation de la sérialisation d'objets à l'aide de la réflexion \u003cbr\u003eContrôle de la sérialisation à l'aide des annotations 12,2,3\u003cbr\u003e 12.2.4 Analyse JSON et désérialisation d'objets\u003cbr\u003e 12.2.5 Étape finale de désérialisation : Création d’objets à l’aide de CallBy() et de la réflexion\u003cbr\u003e addition\u003cbr\u003e\u003cbr\u003e \u003cb\u003eChapitre 13 : Création d’un DSL\u003c\/b\u003e\u003cbr\u003e\u003cbr\u003e 13.1 De l'API au DSL : Création de structures de code personnalisées expressives\u003cbr\u003e 13.1.1 Langages spécifiques à un domaine\u003cbr\u003e 13.1.2 Le DSL interne s'intègre parfaitement au reste du programme.\u003cbr\u003e 13.1.3 Structure DSL\u003cbr\u003e 13.1.4 Création de code HTML avec un DSL interne\u003cbr\u003e 13.2 Création d'une API structurée : Utilisation des lambdas pour spécifier les objets reçus dans le DSL\u003cbr\u003e 13.2.1 Types de fonctions lambda et d'extension pour la spécification des objets récepteurs\u003cbr\u003e 13.2.2 Utilisation d'une fonction lambda spécifiant un objet récepteur dans un générateur HTML\u003cbr\u003e 13.2.3 Générateurs Kotlin : activer l’abstraction et la réutilisation\u003cbr\u003e 13.3 Utilisation de la convention d'invocation pour imbriquer les blocs de manière plus flexible\u003cbr\u003e 13.3.1 Utilisation de la convention d'invocation pour imbriquer les blocs de manière plus flexible\u003cbr\u003e 13.3.2 Conventions d'appel DSL : Déclaration des dépendances Gradle\u003cbr\u003e 13.4 Kotlin DSL en pratique \u003cbr\u003e13.4.1 Enchaînement des appels intermédiaires : Fonction « devrait » du framework de test\u003cbr\u003e 13.4.2 Définition des fonctions d'extension pour les types primitifs : gestion des dates\u003cbr\u003e 13.4.3 Fonctions d'extension de membre : un DSL interne pour SQL\u003cbr\u003e addition\u003cbr\u003e\u003cbr\u003e \u003cb\u003ePartie 3 : Programmation concurrente avec les coroutines et Flow\u003cbr\u003e\u003cbr\u003e Chapitre 14 Coroutines\u003c\/b\u003e\u003cbr\u003e\u003cbr\u003e 14.1 Concurrence et parallélisme\u003cbr\u003e 14.2 Gestion de la concurrence en Kotlin : suspension des fonctions et des coroutines\u003cbr\u003e 14.3 Comparaison des threads et des coroutines\u003cbr\u003e 14.4 Fonctions pouvant mettre en pause : Fonctions de suspension\u003cbr\u003e 14.4.1 Le code utilisant la fonction suspend apparaît séquentiel.\u003cbr\u003e 14.5 Comparaison des coroutines avec d'autres approches\u003cbr\u003e 14.5.1 Appel de la fonction Suspend\u003cbr\u003e 14.6 Découverte du monde des coroutines : générateur de coroutines\u003cbr\u003e 14.6.1 Du code classique au monde des coroutines : la fonction runBlocking\u003cbr\u003e 14.6.2 Création d'une coroutine « lancer et oublier » : la fonction de lancement\u003cbr\u003e 14.6.3 Opérations en attente : Générateurs asynchrones\u003cbr\u003e 14.7 Choisir où exécuter le code : le répartiteur\u003cbr\u003e 14.7.1 Sélection d'un répartiteur\u003cbr\u003e 14.7.2 Transmission d'un répartiteur à un constructeur de coroutines \u003cbr\u003e14.7.3 Modification du répartiteur dans une coroutine à l'aide de withContext\u003cbr\u003e 14.7.4 Les coroutines et les dispatchers ne sont pas une solution magique aux problèmes de sécurité des threads.\u003cbr\u003e Non\u003cbr\u003e 14.8 Les coroutines contiennent des informations supplémentaires dans leur contexte de coroutine.\u003cbr\u003e addition\u003cbr\u003e\u003cbr\u003e \u003cb\u003eChapitre 15 Concurrence structurée\u003c\/b\u003e\u003cbr\u003e\u003cbr\u003e 15.1 La portée des coroutines établit une structure entre les coroutines.\u003cbr\u003e 15.1.1 Création d'une portée de coroutine : la fonction coroutineScope\u003cbr\u003e 15.1.2 Association d'une portée de coroutine à un composant : CoroutineScope\u003cbr\u003e 15.1.3 Risques liés à GlobalScope\u003cbr\u003e 15.1.4 Contextes de coroutines et concurrence structurée\u003cbr\u003e 15.2 Annulation\u003cbr\u003e 15.2.1 Déclencheur d'annulation\u003cbr\u003e 15.2.2 Annulation automatique de l'appel après dépassement du délai imparti\u003cbr\u003e 15.2.3 L'annulation se propage à toutes les coroutines enfants.\u003cbr\u003e 15.2.4 Une coroutine annulée lève une CancellationException à un point particulier.\u003cbr\u003e 15.2.5 L'annulation est coopérative\u003cbr\u003e 15.2.6 Vérification de l'annulation d'une coroutine\u003cbr\u003e 15.2.7 Donner une chance aux autres coroutines : la fonction Yield\u003cbr\u003e 15.2.8 Tenez compte des annulations lors de l'acquisition de ressources \u003cbr\u003e15.2.9 Le framework peut annuler pour vous.\u003cbr\u003e addition\u003cbr\u003e\u003cbr\u003e \u003cb\u003eChapitre 16 Flux\u003c\/b\u003e\u003cbr\u003e\u003cbr\u003e 16.1 Les modèles de flux représentent un flux de valeurs continues.\u003cbr\u003e 16.1.1 Flow vous permet de traiter les éléments dès leur émission.\u003cbr\u003e 16.1.2 Différents types de flux Kotlin\u003cbr\u003e 16.2 Flux froid\u003cbr\u003e 16.2.1 Création d'un flux froid à l'aide de la fonction de création de flux\u003cbr\u003e 16.2.2 Le flux froid n’effectue aucun travail tant qu’il n’est pas collecté.\u003cbr\u003e 16.2.3 Annuler la collecte de flux\u003cbr\u003e 16.2.4 Mise en œuvre interne du flux froid\u003cbr\u003e 16.2.5 Flux simultanés utilisant des flux de canal\u003cbr\u003e 16.3 Flux chaud\u003cbr\u003e 16.3.1 Un flux partagé diffuse des valeurs aux abonnés.\u003cbr\u003e 16.3.2 Suivi de l'état du système : Flux d'état\u003cbr\u003e 16.3.3 Comparaison du flux d'état et du flux partagé\u003cbr\u003e 16.3.4 Flux chaud, flux froid, flux partagé, flux avec état : quand utiliser quel flux ?\u003cbr\u003e addition\u003cbr\u003e\u003cbr\u003e \u003cb\u003eChapitre 17 Opérateurs de flux\u003c\/b\u003e\u003cbr\u003e\u003cbr\u003e 17.1 Manipulation du flux avec les opérateurs de flux \u003cbr\u003e17.2 Des opérateurs intermédiaires sont appliqués au flux amont et renvoient le flux aval.\u003cbr\u003e 17.2.1 Émission de valeurs aléatoires pour chaque élément en amont : la fonction de transformation\u003cbr\u003e 17.2.2 Les opérateurs de prise et les opérateurs associés peuvent annuler le flux\u003cbr\u003e 17.2.3 Activation de chaque étape du flux : onStart, onEach, onCompletion, onEmpty\u003cbr\u003e 17.2.4 Mise en mémoire tampon des éléments pour les opérateurs et collecteurs en aval : l’opérateur de mémoire tampon\u003cbr\u003e 17.2.5 Opérateur qui ignore les valeurs intermédiaires : opérateur de fusion\u003cbr\u003e 17.2.6 Opérateur de filtrage des valeurs sur une période de temps : opérateur de rebond\u003cbr\u003e 17.2.7 Modification du contexte de coroutine dans lequel un flux est exécuté : l’opérateur flowOn\u003cbr\u003e 17.3 Création d'opérateurs intermédiaires personnalisés\u003cbr\u003e 17.4 L'opérateur final exécute le flux en amont et calcule la valeur.\u003cbr\u003e 17.4.1 Le framework fournit des opérateurs personnalisés.\u003cbr\u003e addition\u003cbr\u003e\u003cbr\u003e \u003cb\u003eChapitre 18 Gestion des erreurs et tests\u003c\/b\u003e\u003cbr\u003e\u003cbr\u003e 18.1 Gestion des erreurs levées à l'intérieur des coroutines\u003cbr\u003e 18.2 Propagation des erreurs dans les coroutines Kotlin \u003cbr\u003e18.2.1 Une coroutine qui annule tous les enfants si un enfant échoue.\u003cbr\u003e 18.2.2 La concurrence structurée n'affecte que les exceptions qui étendent la portée de la coroutine.\u003cbr\u003e 18.2.3 Les superviseurs veillent à ce que les parents et les frères et sœurs ne soient pas annulés.\u003cbr\u003e 18.3 CoroutineExceptionHandler : un dernier recours pour la gestion des exceptions\u003cbr\u003e 18.3.1 Différences entre l'application de CoroutineExceptionHandler à launch et async\u003cbr\u003e 18.4 Gestion des exceptions dans Flow\u003cbr\u003e 18.4.1 Gestion des exceptions en amont avec l'opérateur Catch\u003cbr\u003e 18.4.2 Nouvelle tentative de traitement de la collection de flux lorsque le prédicat est vrai : l’opérateur de nouvelle tentative\u003cbr\u003e 18.5 Coroutines et tests de flux\u003cbr\u003e 18.5.1 Écriture rapide de tests à l'aide de coroutines : temps virtuel et répartiteur de tests\u003cbr\u003e 18.5.2 Essai de débit avec turbine\u003cbr\u003e addition\u003cbr\u003e\u003cbr\u003e Annexe A Création d'un projet Kotlin\u003cbr\u003e Annexe B : Documentation du code Kotlin\u003cbr\u003e Annexe C : Écosystème Kotlin\u003c\/div\u003e\n\u003cdiv\u003e\u003c\/div\u003e\n\u003c\/div\u003e\n\u003cbr\u003e\u003cdiv\u003e\u003ch5\u003e \u003cb\u003eAvis de l'éditeur\u003c\/b\u003e\n\u003c\/h5\u003e\u003c\/div\u003e\n\u003cdiv\u003e\n\u003cdiv\u003e \u003cb\u003e◈ Ce que ce livre aborde ◈\u003c\/b\u003e\u003cbr\u003e\u003cbr\u003e ◆ Guide des membres de l'équipe Kotlin\u003cbr\u003e ◆ Langage spécifique au domaine (DSL)\u003cbr\u003e ◆ Coroutines et flux Kotlin\u003cbr\u003e \u003cbr\u003e\u003cb\u003e◈ Public cible de ce livre ◈\u003c\/b\u003e\u003cbr\u003e\u003cbr\u003e Ce livre s'adresse principalement aux développeurs ayant une certaine expérience de Java.\u003cbr\u003e Kotlin s'appuie sur de nombreux concepts et techniques présents en Java, et ce livre tire parti des connaissances existantes des lecteurs pour les aider à apprendre rapidement Kotlin.\u003cbr\u003e\u003cbr\u003e Les lecteurs ayant déjà une expérience d'autres langages de programmation, tels que C# ou JavaScript, auront besoin d'autres ressources pour comprendre les subtilités de l'interaction de Kotlin avec la JVM, mais ils peuvent tout de même utiliser ce livre pour apprendre Kotlin.\u003cbr\u003e Ce livre couvre l'intégralité du langage Kotlin et ne se concentre sur aucun domaine problématique spécifique.\u003cbr\u003e Cela sera donc utile aux développeurs de serveurs, aux développeurs Android, ou à tout développeur créant des projets fonctionnant sur la JVM.\u003cbr\u003e\u003cbr\u003e \u003cb\u003e◈ Note de l'auteur ◈\u003c\/b\u003e\u003cbr\u003e\u003cbr\u003e L'idée du langage Kotlin a vu le jour chez JetBrains en 2010. \u003cbr\u003eÀ l'époque, JetBrains était une entreprise réputée et relativement prospère qui fournissait des outils de développement pour divers langages tels que Java, C#, JavaScript, Python, Ruby et PHP.\u003cbr\u003e Le produit phare de JetBrains, l'environnement de développement intégré Java IntelliJ IDEA, inclut également des plugins pour faciliter le développement en Scala et Groovy.\u003cbr\u003e\u003cbr\u003e Notre expérience en matière de développement d'outils pour une gamme aussi diversifiée de langages nous a permis d'acquérir une perspective et une compréhension uniques de l'ensemble du paysage des langages de programmation.\u003cbr\u003e Et tous les environnements de développement intégrés (IDE) qui utilisent IntelliJ comme plateforme, y compris IntelliJ IDEA lui-même, ont été développés en Java.\u003cbr\u003e Nous envions tellement nos collègues de l'équipe .Net qui développaient en C#, un langage moderne, puissant et en constante évolution, mais nous ne trouvions aucun langage capable de remplacer Java.\u003cbr\u003e Quelles étaient nos exigences pour un langage destiné à remplacer Java ?\u003cbr\u003e \u003cbr\u003eLa première et la plus évidente des exigences était le typage statique.\u003cbr\u003e Il n'existe pas d'autre moyen de développer une base de code de plusieurs millions de lignes sans devenir fou, si ce n'est le typage statique.\u003cbr\u003e Deuxièmement, nous avions besoin d'un langage entièrement compatible avec le code Java existant.\u003cbr\u003e Notre base de code existante est un atout incroyablement précieux pour JetBrains, et nous ne pouvions pas nous permettre de la perdre ou de voir sa valeur diminuée en raison d'un manque d'interopérabilité.\u003cbr\u003e Troisièmement, nous ne voulions pas faire de compromis sur la disponibilité des outils.\u003cbr\u003e Pour JetBrains, la valeur la plus importante est la productivité du développement, et atteindre une productivité élevée nécessite d'excellents outils.\u003cbr\u003e Enfin, il nous fallait un langage facile à apprendre et dont le code permette de comprendre aisément le fonctionnement.\u003cbr\u003e \u003cbr\u003eAu moment où nous avons constaté ce besoin non satisfait au sein de notre entreprise, nous avons réalisé que certaines entreprises se trouvaient dans une situation similaire.\u003cbr\u003e Par conséquent, nous pouvions nous attendre à ce que si nous parvenions à créer une solution répondant aux besoins de JetBrains, nous trouvions davantage d'utilisateurs en dehors de JetBrains.\u003cbr\u003e C’est dans cette optique que nous avons décidé de lancer un projet visant à créer un nouveau langage : Kotlin.\u003cbr\u003e\u003cbr\u003e La période de développement du langage a été plus longue que prévu initialement, et Kotlin 1.0 a été publié plus de cinq ans après le premier commit sur le dépôt.\u003cbr\u003e Depuis, Kotlin a trouvé une base d'utilisateurs qui le désire, et son propre écosystème s'est magnifiquement développé, et cette progression se poursuit encore aujourd'hui.\u003cbr\u003e\u003cbr\u003e Kotlin est basé à Saint-Pétersbourg, en Russie.\u003cbr\u003e C'est le nom d'une île près de Saint-Pétersbourg. \u003cbr\u003eLe choix du nom de l'île s'inscrit dans les traditions des langues javanaise et ceylanaise.\u003cbr\u003e\u003cbr\u003e À l'approche de la sortie officielle de Kotlin, j'ai pensé qu'il serait utile d'avoir un livre écrit par des personnes ayant participé à la conception du langage et capables d'expliquer avec assurance pourquoi ses fonctionnalités sont telles qu'elles sont.\u003cbr\u003e Ce livre s'inscrit dans cette démarche, et j'espère que les lecteurs apprendront et comprendront mieux le langage Kotlin grâce à lui.\u003cbr\u003e Bonne chance et j'espère que vous prendrez toujours plaisir à développer.\u003cbr\u003e\u003cbr\u003e \u003cb\u003e◈ Note du traducteur ◈\u003c\/b\u003e\u003cbr\u003e\u003cbr\u003e En 2017, lors de la traduction de la première édition de ce livre, Kotlin commençait à être utilisé sérieusement sur Android, et les concepts de programmation fonctionnelle s'intégraient lentement dans le monde des langages de programmation grand public grâce à Scala, Hadoop et d'autres.\u003cbr\u003e La « Note du traducteur » de la première édition devait donc expliquer en détail le contenu concerné. \u003cbr\u003eCependant, avec le temps, Kotlin s'est solidement implanté dans la programmation Android, le nombre de développeurs et d'entreprises utilisant Kotlin dans la programmation serveur a considérablement augmenté, et le concept de programmation fonctionnelle s'est également solidement établi dans une certaine mesure. Je pense donc qu'il n'est plus nécessaire d'expliquer les caractéristiques ou les avantages du langage Kotlin et ceux de la programmation fonctionnelle.\u003cbr\u003e Tout développeur qui prendra ce livre en main sera prêt à tomber amoureux du langage rien qu'en entendant le nom Kotlin.\u003cbr\u003e\u003cbr\u003e Kotlin ne se contente plus d'être un meilleur remplaçant de Java sur la JVM, mais s'impose désormais comme un langage de programmation autonome, doté de son propre framework de programmation concurrente et d'une prise en charge multiplateforme. \u003cbr\u003eGrâce à ce livre, vous pourrez apprendre la philosophie et la grammaire de base du langage Kotlin, le traitement des collections à l'aide de techniques de programmation fonctionnelle de base, les méthodes de développement DSL internes et d'API riches utilisant les fonctionnalités de support DSL du langage Kotlin, ainsi que la programmation concurrente\/parallèle à l'aide des coroutines Kotlin et de Flow.\u003cbr\u003e Vous apprendrez également à utiliser Java et Kotlin ensemble dans vos projets sur la JVM.\u003cbr\u003e Les développeurs qui auront acquis de solides bases en Kotlin grâce à ce livre seront capables d'utiliser Kotlin dans divers domaines, tels que le développement d'applications multiplateformes via Compose Multiplatform ou le développement de serveurs à architecture propre intégrant des bibliothèques Java telles que Spring. \u003cbr\u003ePar exemple, Mobility42, où travaille le traducteur, a développé sa propre bibliothèque multiplateforme Kotlin et l'utilise pour développer diverses applications telles que des serveurs (modélisation de bases de données à l'aide de sa propre bibliothèque serveur basée sur Spring et d'un DSL interne), des applications web (JavaScript + sa propre bibliothèque de composants développée) et Compose Desktop.\u003cbr\u003e\u003cbr\u003e J’espère sincèrement que grâce à ce livre, Kotlin deviendra un outil que vous pourrez utiliser confortablement au travail, comme une massue bien conçue qui tient parfaitement dans la main.\u003cbr\u003e Et j'espère que le gain de productivité que vous obtiendrez grâce à Kotlin vous permettra de profiter de soirées plus tranquilles. \u003cbr\u003e\n\n\u003c\/div\u003e\n\u003cdiv\u003e\u003c\/div\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\n\n\u003c\/div\u003e\n\n\u003ccenter\u003e\u003ctable\u003e\u003ctr\u003e\u003ctd style=\"height:10px\"\u003e\u003c\/td\u003e\u003c\/tr\u003e\u003c\/table\u003e\u003c\/center\u003e\n\n\u003ccenter\u003e\u003ctable\u003e\u003ctr\u003e\u003ctd style=\"height:10px\"\u003e\u003c\/td\u003e\u003c\/tr\u003e\u003c\/table\u003e\u003c\/center\u003e\n\n\u003cdiv style=\"width:95%;padding-top:20px;padding-bottom:20px\"\u003e\n\n\u003cdiv style=\"text-align:left;font-size:16px;font-weight:bold;padding-bottom:20px\"\u003e SPÉCIFICATIONS DES PRODUITS \u003c\/div\u003e\n\n\u003cdiv style=\"text-align:left;font-size:14px;line-height:1.6em;\"\u003e\n\n\u003cdiv style=\"width:100%;margin-bottom:5px;line-height:1.6em;font-size:14px\"\u003e - \u003cstrong\u003eDate d'émission :\u003c\/strong\u003e 27 février 2025\u003c\/div\u003e\n\n\u003cdiv style=\"width:100%;margin-bottom:5px;line-height:1.6em;font-size:14px\"\u003e - \u003cstrong\u003eNombre de pages, poids, dimensions :\u003c\/strong\u003e 804 pages | 188 × 235 × 37 mm\u003c\/div\u003e\n\n\u003cdiv style=\"width:100%;margin-bottom:5px;line-height:1.6em;font-size:14px\"\u003e - \u003cstrong\u003eISBN13 :\u003c\/strong\u003e 9791161759692\u003c\/div\u003e\n\n\u003cdiv style=\"width:100%;margin-bottom:5px;line-height:1.6em;font-size:14px\"\u003e - \u003cstrong\u003eISBN10 :\u003c\/strong\u003e 1161759697 \u003c\/div\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003c\/div\u003e\n\n\n\u003c\/div\u003e\n\n\u003ccenter\u003e\n\n\u003ccenter\u003e\u003ctable\u003e\u003ctr\u003e\u003ctd style=\"height:10px\"\u003e\u003c\/td\u003e\u003c\/tr\u003e\u003c\/table\u003e\u003c\/center\u003e\n\n\u003ccenter\u003e\u003ctable\u003e\u003ctr\u003e\u003ctd style=\"height:10px\"\u003e\u003c\/td\u003e\u003c\/tr\u003e\u003c\/table\u003e\u003c\/center\u003e\n\n\u003cspan\u003e\u003c\/span\u003e\n\n\u003c\/center\u003e\n\n\n\u003c\/center\u003e","brand":"LIBRAIRIE COREENNE","offers":[{"title":"Default Title","offer_id":43893669003306,"sku":"110072","price":54.0,"currency_code":"EUR","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0683\/2750\/5962\/files\/07f6b39f6d39e20b61fcded5e4194fa3.jpg?v=1765410910","url":"https:\/\/librairie.coreenne.fr\/products\/110072","provider":"LIBRAIRIE COREENNE","version":"1.0","type":"link"}