
Java moderne en action
Description
Introduction au livre
Le changement le plus important survenu en 18 ans depuis la sortie de Java 1.0 est Java 8.
Avec Java moderne depuis Java 8, vous pouvez utiliser tout votre code Java existant tel quel, et vous pouvez également implémenter un code plus clair et plus concis grâce à de nouvelles fonctionnalités, une nouvelle syntaxe et de nouveaux modèles de conception.
Ce livre présente aux développeurs Java les principales fonctionnalités ajoutées à Java 8, 9 et 10, notamment les lambdas, les flux, la programmation fonctionnelle, le système de modules Java, le parallélisme et les données mutables partagées, ainsi que la paramétrisation du comportement, inspirée des langages fonctionnels.
Nous récompenserons vos efforts par des exemples limpides et des informations détaillées.
Ce livre est une édition révisée de Java 8 in Action, avec les chapitres 1, 8, 10, 4, 17 et 21 nouvellement ajoutés ou considérablement révisés.
Tous les chapitres, à l'exception de l'annexe, ont été révisés et complétés.
Avec Java moderne depuis Java 8, vous pouvez utiliser tout votre code Java existant tel quel, et vous pouvez également implémenter un code plus clair et plus concis grâce à de nouvelles fonctionnalités, une nouvelle syntaxe et de nouveaux modèles de conception.
Ce livre présente aux développeurs Java les principales fonctionnalités ajoutées à Java 8, 9 et 10, notamment les lambdas, les flux, la programmation fonctionnelle, le système de modules Java, le parallélisme et les données mutables partagées, ainsi que la paramétrisation du comportement, inspirée des langages fonctionnels.
Nous récompenserons vos efforts par des exemples limpides et des informations détaillées.
Ce livre est une édition révisée de Java 8 in Action, avec les chapitres 1, 8, 10, 4, 17 et 21 nouvellement ajoutés ou considérablement révisés.
Tous les chapitres, à l'exception de l'annexe, ont été révisés et complétés.
indice
À propos du traducteur et de l'auteur
Note du traducteur
Note de l'auteur
À propos de ce livre
Introduction à l'illustration de couverture
[ PARTIE I BASES ]
CHAPITRE 1 Java 8, 9, 10, 11 : Que se passe-t-il ?
1.1 Quel est le cours de l'histoire ?
1.2 Pourquoi Java continue-t-il d'évoluer ?
1.3 Fonctions Java
1.4 Flux
1.5 Méthodes par défaut et modules Java
1.6 Autres idées utiles issues de la programmation fonctionnelle
1.7 En conclusion
CHAPITRE 2 Code de paramétrage du comportement de transmission
2.1 Répondre à l'évolution des besoins
2.2 Paramétrisation du mouvement
2.3 Simplifier les processus complexes
2.4 Exemples pratiques
2.5 En conclusion
CHAPITRE 3 Expressions lambda
3.1 Qu'est-ce que Lambda ?
3.2 Où et comment utiliser lambda ?
3.3 Utilisation de Lambda : le modèle de contournement
3.4 Utilisation des interfaces fonctionnelles
3.5 Vérification de type, inférence de type et contraintes
3.6 Référence de méthode
3.7 Utilisation des fonctions lambda et des références de méthodes
3.8 Méthodes utiles pour combiner des expressions lambda
3.9 Concepts mathématiques similaires
3.10 En conclusion
[ PARTIE II Traitement fonctionnel des données ]
CHAPITRE 4 : Introduction au cours d'eau
4.1 Qu'est-ce qu'un flux ?
4.2 Démarrage du flux
4.3 Flux et collections
4.4 Opérations de flux
Feuille de route 4.5
4.6 En conclusion
CHAPITRE 5 Utilisation des cours d'eau
5.1 Filtrage
5.2 Découpage de flux
5.3 Cartographie
5.4 Recherche et correspondance
5.5 Réduction
5.6 Pratique sur le terrain
5.7 Flux numériques
5.8 Création d'un flux
5.9 En conclusion
CHAPITRE 6 Collecte de données à partir de flux
6.1 Qu'est-ce qu'un collectionneur ?
6.2 Réduction et synthèse
6.3 Groupement
6.4 Split
6.5 Interface du collecteur
6.6 Amélioration des performances par la mise en œuvre d'un collecteur personnalisé
6.7 En conclusion
CHAPITRE 7 Traitement parallèle des données et performances
7.1 Flux parallèles
7.2 Cadre Fork/Join
7.3 Interface du répartiteur
7.4 En conclusion
[ PARTIE III Programmation efficace avec les flux et les lambdas ]
CHAPITRE 8 Améliorations de l'API Collection
8.1 Usine de collecte
8.2 Gestion des listes et des ensembles
8.3 Traitement des cartes
8.4 Amélioration de ConcurrentHashMap
8.5 En conclusion
CHAPITRE 9 Refactorisation, tests et débogage
9.1 Refactorisation pour améliorer la lisibilité et la flexibilité
9.2 Refactorisation des modèles de conception orientés objet avec des lambdas
9.3 Tests Lambda
9.4 Débogage
9.5 En conclusion
CHAPITRE 10 Langages spécifiques à un domaine utilisant Lambda
10.1 Langage spécifique au domaine
10.2 Un petit DSL pour la dernière API Java
10.3 Modèles et techniques de création de DSL en Java
10.4 DSL Java 8 en situation réelle
10.5 En conclusion
[ PARTIE IV Au quotidien avec Java ]
CHAPITRE 11 Classe optionnelle au lieu de null
11.1 Comment gérer les situations où il n'y a pas de valeur ?
11.2 Présentation de la classe optionnelle
11.3 Modèle d'application optionnel
11.4 Exemples pratiques utilisant les options
11.5 En conclusion
CHAPITRE 12 NOUVELLE API DE DATE ET D'HEURE
12.1 Classes LocalDate, LocalTime, Instant, Duration et Period
12.2 Ajustement, analyse et mise en forme des dates
12.3 Comment utiliser différents fuseaux horaires et calendriers
12.4 En conclusion
CHAPITRE 13 Méthodes par défaut
13.1 Modification des API
13.2 Qu'est-ce qu'une méthode par défaut ?
13.3 Modèles d'utilisation des méthodes par défaut
13.4 Règles d'interprétation
13.5 En conclusion
CHAPITRE 14 Le système de modules Java
14.1 Pression : Analogie logicielle
14.2 Pourquoi le système de modules Java a-t-il été conçu ?
14.3 Modules Java : Vue d’ensemble
14.4 Développement d'applications avec le système de modules Java
14.5 Utilisation de plusieurs modules
14.6 Compilation et conditionnement
14.7 Module automatique
14.8 Définition et syntaxe du module
14.9 Des exemples plus importants et davantage de façons d'apprendre
14.10 En conclusion
[ PARTIE V Amélioration de la concurrence en Java ]
CHAPITRE 15 : CompletableFuture et les concepts fondamentaux de la programmation réactive
15.1 Évolution de la prise en charge de la concurrence par Java
15.2 API synchrones et asynchrones
15.3 Modèles de boîtiers et de canaux
15.4 Concurrence avec CompletableFuture et Combinators
15.5 Programmation de type publication/abonnement et réactive
15.6 Systèmes réactifs vs. Programmation réactive
15.7 En conclusion
CHAPITRE 16 CompletableFuture : Programmation asynchrone fiable
16.1 Utilisations simples du futur
16.2 Mise en œuvre des API asynchrones
16.3 Création de code non-bloc
16.4 Création d'un pipeline de travail asynchrone
16.5 Comment réagir à la résiliation de CompletableFuture
Feuille de route 16.6
16.7 En conclusion
CHAPITRE 17 Programmation réactive
17.1 Manifeste réactif
17.2 Flux réactifs et API Flow
17.3 Utilisation de la bibliothèque réactive RxJava
17.4 En conclusion
PARTIE VI : Programmation fonctionnelle et avenir de l'évolution de Java
CHAPITRE 18 Penser dans une perspective fonctionnelle
18.1 Mise en œuvre et maintenance du système
18.2 Qu'est-ce que la programmation fonctionnelle ?
18.3 Récursivité et itération
18.4 En conclusion
CHAPITRE 19 TECHNIQUES DE PROGRAMMATION FONCTIONNELLE
19.1 Les fonctions sont partout
19.2 Structures de données persistantes
19.3 Flux et évaluation paresseuse
19.4 Correspondance des motifs
19.5 Autres informations
19.6 En conclusion
CHAPITRE 20 Harmonisation de la POO et de la programmation fonctionnelle : comparaison de Java et Scala
20.1 Introduction à Scala
20.2 Fonctions
20.3 Classes et caractéristiques
20.4 En conclusion
CHAPITRE 21 Conclusion et avenir de Java
21.1 Présentation des fonctionnalités de Java 8
21.2 Système de modules Java 9
21.3 Inférence du type des variables locales en Java 10
21.4 L'avenir de Java
21.5 Java évolue plus vite
21.6 Conclusion
supplément
_ANNEXE A Autres mises à jour linguistiques
_ANNEXE B Autres mises à jour de la bibliothèque
ANNEXE : Exécution de plusieurs opérations en parallèle sur un flux C
_ANNEXE D Lambdas et bytecode JVM
Note du traducteur
Note de l'auteur
À propos de ce livre
Introduction à l'illustration de couverture
[ PARTIE I BASES ]
CHAPITRE 1 Java 8, 9, 10, 11 : Que se passe-t-il ?
1.1 Quel est le cours de l'histoire ?
1.2 Pourquoi Java continue-t-il d'évoluer ?
1.3 Fonctions Java
1.4 Flux
1.5 Méthodes par défaut et modules Java
1.6 Autres idées utiles issues de la programmation fonctionnelle
1.7 En conclusion
CHAPITRE 2 Code de paramétrage du comportement de transmission
2.1 Répondre à l'évolution des besoins
2.2 Paramétrisation du mouvement
2.3 Simplifier les processus complexes
2.4 Exemples pratiques
2.5 En conclusion
CHAPITRE 3 Expressions lambda
3.1 Qu'est-ce que Lambda ?
3.2 Où et comment utiliser lambda ?
3.3 Utilisation de Lambda : le modèle de contournement
3.4 Utilisation des interfaces fonctionnelles
3.5 Vérification de type, inférence de type et contraintes
3.6 Référence de méthode
3.7 Utilisation des fonctions lambda et des références de méthodes
3.8 Méthodes utiles pour combiner des expressions lambda
3.9 Concepts mathématiques similaires
3.10 En conclusion
[ PARTIE II Traitement fonctionnel des données ]
CHAPITRE 4 : Introduction au cours d'eau
4.1 Qu'est-ce qu'un flux ?
4.2 Démarrage du flux
4.3 Flux et collections
4.4 Opérations de flux
Feuille de route 4.5
4.6 En conclusion
CHAPITRE 5 Utilisation des cours d'eau
5.1 Filtrage
5.2 Découpage de flux
5.3 Cartographie
5.4 Recherche et correspondance
5.5 Réduction
5.6 Pratique sur le terrain
5.7 Flux numériques
5.8 Création d'un flux
5.9 En conclusion
CHAPITRE 6 Collecte de données à partir de flux
6.1 Qu'est-ce qu'un collectionneur ?
6.2 Réduction et synthèse
6.3 Groupement
6.4 Split
6.5 Interface du collecteur
6.6 Amélioration des performances par la mise en œuvre d'un collecteur personnalisé
6.7 En conclusion
CHAPITRE 7 Traitement parallèle des données et performances
7.1 Flux parallèles
7.2 Cadre Fork/Join
7.3 Interface du répartiteur
7.4 En conclusion
[ PARTIE III Programmation efficace avec les flux et les lambdas ]
CHAPITRE 8 Améliorations de l'API Collection
8.1 Usine de collecte
8.2 Gestion des listes et des ensembles
8.3 Traitement des cartes
8.4 Amélioration de ConcurrentHashMap
8.5 En conclusion
CHAPITRE 9 Refactorisation, tests et débogage
9.1 Refactorisation pour améliorer la lisibilité et la flexibilité
9.2 Refactorisation des modèles de conception orientés objet avec des lambdas
9.3 Tests Lambda
9.4 Débogage
9.5 En conclusion
CHAPITRE 10 Langages spécifiques à un domaine utilisant Lambda
10.1 Langage spécifique au domaine
10.2 Un petit DSL pour la dernière API Java
10.3 Modèles et techniques de création de DSL en Java
10.4 DSL Java 8 en situation réelle
10.5 En conclusion
[ PARTIE IV Au quotidien avec Java ]
CHAPITRE 11 Classe optionnelle au lieu de null
11.1 Comment gérer les situations où il n'y a pas de valeur ?
11.2 Présentation de la classe optionnelle
11.3 Modèle d'application optionnel
11.4 Exemples pratiques utilisant les options
11.5 En conclusion
CHAPITRE 12 NOUVELLE API DE DATE ET D'HEURE
12.1 Classes LocalDate, LocalTime, Instant, Duration et Period
12.2 Ajustement, analyse et mise en forme des dates
12.3 Comment utiliser différents fuseaux horaires et calendriers
12.4 En conclusion
CHAPITRE 13 Méthodes par défaut
13.1 Modification des API
13.2 Qu'est-ce qu'une méthode par défaut ?
13.3 Modèles d'utilisation des méthodes par défaut
13.4 Règles d'interprétation
13.5 En conclusion
CHAPITRE 14 Le système de modules Java
14.1 Pression : Analogie logicielle
14.2 Pourquoi le système de modules Java a-t-il été conçu ?
14.3 Modules Java : Vue d’ensemble
14.4 Développement d'applications avec le système de modules Java
14.5 Utilisation de plusieurs modules
14.6 Compilation et conditionnement
14.7 Module automatique
14.8 Définition et syntaxe du module
14.9 Des exemples plus importants et davantage de façons d'apprendre
14.10 En conclusion
[ PARTIE V Amélioration de la concurrence en Java ]
CHAPITRE 15 : CompletableFuture et les concepts fondamentaux de la programmation réactive
15.1 Évolution de la prise en charge de la concurrence par Java
15.2 API synchrones et asynchrones
15.3 Modèles de boîtiers et de canaux
15.4 Concurrence avec CompletableFuture et Combinators
15.5 Programmation de type publication/abonnement et réactive
15.6 Systèmes réactifs vs. Programmation réactive
15.7 En conclusion
CHAPITRE 16 CompletableFuture : Programmation asynchrone fiable
16.1 Utilisations simples du futur
16.2 Mise en œuvre des API asynchrones
16.3 Création de code non-bloc
16.4 Création d'un pipeline de travail asynchrone
16.5 Comment réagir à la résiliation de CompletableFuture
Feuille de route 16.6
16.7 En conclusion
CHAPITRE 17 Programmation réactive
17.1 Manifeste réactif
17.2 Flux réactifs et API Flow
17.3 Utilisation de la bibliothèque réactive RxJava
17.4 En conclusion
PARTIE VI : Programmation fonctionnelle et avenir de l'évolution de Java
CHAPITRE 18 Penser dans une perspective fonctionnelle
18.1 Mise en œuvre et maintenance du système
18.2 Qu'est-ce que la programmation fonctionnelle ?
18.3 Récursivité et itération
18.4 En conclusion
CHAPITRE 19 TECHNIQUES DE PROGRAMMATION FONCTIONNELLE
19.1 Les fonctions sont partout
19.2 Structures de données persistantes
19.3 Flux et évaluation paresseuse
19.4 Correspondance des motifs
19.5 Autres informations
19.6 En conclusion
CHAPITRE 20 Harmonisation de la POO et de la programmation fonctionnelle : comparaison de Java et Scala
20.1 Introduction à Scala
20.2 Fonctions
20.3 Classes et caractéristiques
20.4 En conclusion
CHAPITRE 21 Conclusion et avenir de Java
21.1 Présentation des fonctionnalités de Java 8
21.2 Système de modules Java 9
21.3 Inférence du type des variables locales en Java 10
21.4 L'avenir de Java
21.5 Java évolue plus vite
21.6 Conclusion
supplément
_ANNEXE A Autres mises à jour linguistiques
_ANNEXE B Autres mises à jour de la bibliothèque
ANNEXE : Exécution de plusieurs opérations en parallèle sur un flux C
_ANNEXE D Lambdas et bytecode JVM
Image détaillée

Avis de l'éditeur
Découvrez les toutes nouvelles fonctionnalités de Java 8, 9 et 10 d'une manière rafraîchissante !
Ce livre vous montre comment appliquer concrètement les dernières fonctionnalités de Java à vos applications.
Nous récompenserons vos efforts par des exemples limpides et des informations détaillées.
Vous apprendrez également à tirer parti de vos connaissances existantes en Java de base, ainsi que des ajouts modernes tels que l'API Streams, le système de modules Java, les nouvelles approches de la concurrence et les concepts fonctionnels, pour vous aider à implémenter un code lisible et maintenable.
Pourquoi devrais-je utiliser cette nouvelle fonctionnalité ?
Par exemple, parmi les nouvelles fonctionnalités ajoutées, lambda permet d'implémenter des programmes Java plus concis.
La plupart des lecteurs auront déjà eu l'occasion d'enregistrer des objets contenant des méthodes à appeler lorsqu'un événement se produit, en utilisant des gestionnaires d'événements, des fonctions de rappel, etc.
Lambda permet d'utiliser cette fonctionnalité dans un plus large éventail de domaines.
En d'autres termes, vous pouvez simplement passer du code ou des méthodes exécutables lors d'une opération en tant qu'arguments grâce à lambda et à son ami, la référence de méthode.
Au final, vous constaterez que cette fonctionnalité est utilisée plus souvent que vous ne le pensez, qu'il s'agisse de paramétrer des méthodes dans le code ou de réaliser des requêtes complexes qui ingèrent des données à l'aide de la nouvelle API Streams.
Structure de ce livre
Ce livre est principalement composé de six sections : « Bases », « Traitement fonctionnel des données », « Programmation efficace avec les flux et les lambdas », « Java au quotidien », « Concurrence Java améliorée » et « Programmation fonctionnelle et avenir de l’évolution de Java ».
Les chapitres introduits dans les parties 1 et 2 doivent être lus afin de comprendre le contexte, mais les quatre parties restantes sont indépendantes et peuvent être lues dans n'importe quel ordre.
La plupart des chapitres comprennent divers quiz pour vous aider à vous entraîner.
_Partie 1 : Propose trois chapitres couvrant un contenu adapté aux lecteurs qui découvrent Java 8.
À la fin de la première partie, vous comprendrez ce que sont les expressions lambda et vous serez capable de les utiliser pour écrire un code concis et flexible qui peut facilement s'adapter à l'évolution des besoins.
_Partie 2 : Présentation détaillée de la nouvelle API de flux.
À la fin de la partie 2, vous saurez ce que sont les flux et comment les utiliser pour implémenter des applications concises et efficaces qui traitent des ensembles de données.
_Partie 3 : Nous examinerons divers contenus relatifs à Java 8 et Java 9 qui vous aideront à utiliser Java plus efficacement et à améliorer votre code grâce aux techniques les plus récentes.
L'objectif étant d'expliquer les concepts de programmation les plus récents possibles, les autres parties de ce livre n'utilisent pas les éléments abordés dans la partie 3.
_Partie 4 : Nous examinerons diverses nouvelles fonctionnalités ajoutées à Java 8 et Java 9 pour faciliter et fiabiliser l’écriture du code qui compose vos projets.
_Partie 5 : Nous irons au-delà des méthodes de traitement parallèle faciles utilisant des flux décrites dans les chapitres 6 et 7 et examinerons des techniques avancées pour structurer la programmation parallèle en Java.
_Partie 6 : Changeons un peu de sujet et comparons les fonctionnalités de Scala et de Java 8 pour voir comment implémenter efficacement la programmation fonctionnelle en Java.
_Annexe : L’annexe A résume les fonctionnalités mineures du langage Java 8 qui n’ont pas été abordées dans le livre.
L’annexe B décrit les fonctionnalités ajoutées à la bibliothèque Java qui peuvent s’avérer utiles.
L’annexe C est un prolongement de la partie 2 et décrit l’utilisation avancée des flux.
L’annexe D explique en détail comment le compilateur Java implémente les expressions lambda.
Sommaire de ce livre
- Comment utiliser les nouvelles fonctionnalités puissantes de Java 8, Java 9 et Java 10
Comment implémenter des applications exploitant efficacement les processeurs multicœurs ? - Comment implémenter des applications tirant pleinement parti des processeurs multicœurs ?
- Refactorisation, tests, débogage
- Application de la programmation fonctionnelle
- Annexe contenant des quiz, des questions surprises et des mises à jour
Ce livre vous montre comment appliquer concrètement les dernières fonctionnalités de Java à vos applications.
Nous récompenserons vos efforts par des exemples limpides et des informations détaillées.
Vous apprendrez également à tirer parti de vos connaissances existantes en Java de base, ainsi que des ajouts modernes tels que l'API Streams, le système de modules Java, les nouvelles approches de la concurrence et les concepts fonctionnels, pour vous aider à implémenter un code lisible et maintenable.
Pourquoi devrais-je utiliser cette nouvelle fonctionnalité ?
Par exemple, parmi les nouvelles fonctionnalités ajoutées, lambda permet d'implémenter des programmes Java plus concis.
La plupart des lecteurs auront déjà eu l'occasion d'enregistrer des objets contenant des méthodes à appeler lorsqu'un événement se produit, en utilisant des gestionnaires d'événements, des fonctions de rappel, etc.
Lambda permet d'utiliser cette fonctionnalité dans un plus large éventail de domaines.
En d'autres termes, vous pouvez simplement passer du code ou des méthodes exécutables lors d'une opération en tant qu'arguments grâce à lambda et à son ami, la référence de méthode.
Au final, vous constaterez que cette fonctionnalité est utilisée plus souvent que vous ne le pensez, qu'il s'agisse de paramétrer des méthodes dans le code ou de réaliser des requêtes complexes qui ingèrent des données à l'aide de la nouvelle API Streams.
Structure de ce livre
Ce livre est principalement composé de six sections : « Bases », « Traitement fonctionnel des données », « Programmation efficace avec les flux et les lambdas », « Java au quotidien », « Concurrence Java améliorée » et « Programmation fonctionnelle et avenir de l’évolution de Java ».
Les chapitres introduits dans les parties 1 et 2 doivent être lus afin de comprendre le contexte, mais les quatre parties restantes sont indépendantes et peuvent être lues dans n'importe quel ordre.
La plupart des chapitres comprennent divers quiz pour vous aider à vous entraîner.
_Partie 1 : Propose trois chapitres couvrant un contenu adapté aux lecteurs qui découvrent Java 8.
À la fin de la première partie, vous comprendrez ce que sont les expressions lambda et vous serez capable de les utiliser pour écrire un code concis et flexible qui peut facilement s'adapter à l'évolution des besoins.
_Partie 2 : Présentation détaillée de la nouvelle API de flux.
À la fin de la partie 2, vous saurez ce que sont les flux et comment les utiliser pour implémenter des applications concises et efficaces qui traitent des ensembles de données.
_Partie 3 : Nous examinerons divers contenus relatifs à Java 8 et Java 9 qui vous aideront à utiliser Java plus efficacement et à améliorer votre code grâce aux techniques les plus récentes.
L'objectif étant d'expliquer les concepts de programmation les plus récents possibles, les autres parties de ce livre n'utilisent pas les éléments abordés dans la partie 3.
_Partie 4 : Nous examinerons diverses nouvelles fonctionnalités ajoutées à Java 8 et Java 9 pour faciliter et fiabiliser l’écriture du code qui compose vos projets.
_Partie 5 : Nous irons au-delà des méthodes de traitement parallèle faciles utilisant des flux décrites dans les chapitres 6 et 7 et examinerons des techniques avancées pour structurer la programmation parallèle en Java.
_Partie 6 : Changeons un peu de sujet et comparons les fonctionnalités de Scala et de Java 8 pour voir comment implémenter efficacement la programmation fonctionnelle en Java.
_Annexe : L’annexe A résume les fonctionnalités mineures du langage Java 8 qui n’ont pas été abordées dans le livre.
L’annexe B décrit les fonctionnalités ajoutées à la bibliothèque Java qui peuvent s’avérer utiles.
L’annexe C est un prolongement de la partie 2 et décrit l’utilisation avancée des flux.
L’annexe D explique en détail comment le compilateur Java implémente les expressions lambda.
Sommaire de ce livre
- Comment utiliser les nouvelles fonctionnalités puissantes de Java 8, Java 9 et Java 10
Comment implémenter des applications exploitant efficacement les processeurs multicœurs ? - Comment implémenter des applications tirant pleinement parti des processeurs multicœurs ?
- Refactorisation, tests, débogage
- Application de la programmation fonctionnelle
- Annexe contenant des quiz, des questions surprises et des mises à jour
SPÉCIFICATIONS DES PRODUITS
- Date de publication : 1er août 2019
Nombre de pages, poids, dimensions : 692 pages | 926 g | 183 × 235 × 35 mm
- ISBN13 : 9791162242025
- ISBN10 : 1162242027
Vous aimerez peut-être aussi
카테고리
Langue coréenne
Langue coréenne