Java 8 est enfin arrivé! Faire fonctionner la programmation de données.
La méthode fonctionnelle de traitement des données
Java 8 ajoute non seulement le support fonctionnel, mais il étend également la classe de collecte par de nouvelles données de traitement des fonctions.
Par exemple, supposons que vous ayez une collection de collection: Client: Client::
CLIENTS <Customer> Clients;
Si vous n'êtes intéressé que par les clients de la Belgique, vous aurez tous les objets clients et enregistrez uniquement ce dont vous avez besoin.
Collection <Sivet> Belgians = New ArrayList <() ();
Cela coûte non seulement 5 lignes de code, mais ce n'est pas très abstrait. Code Thread pour réécrire tout le code.
Avec Java 8, une seule ligne de code peut atteindre les mêmes fonctionnalités. Faites simplement la filtration.
Clients.Stream ().
Le code de la version Java 8 est non seulement plus court, mais aussi plus facile à comprendre. perdre du temps dans l'interprétation du code dans le cycle d'interprétation pour comprendre ce qu'il fait pour ses données.
Que dois-je faire si vous souhaitez exécuter ce code simultanément?
Clients.ParallelStream ().
Ce qui est plus excitant, c'est que ce code de style fonctionnel est également applicable à la base de données
Utilisez une méthode de fonction dans la base de données
Traditionnellement, les programmeurs doivent utiliser une base de données spéciale pour interroger la déclaration pour accéder aux données de la base de données.
PréparéStatement s = con.preparestatement ("SELECT *" + "From Client C" + "Where C.Country =?");La plupart de ces code sont une chaîne, ce qui fera que le compilateur ne trouve pas d'erreurs et ce code hâtif entraînera des problèmes de sécurité. Fournissez un langage de requête de base de données, vous pouvez résoudre de mauvais contrôles et problèmes de sécurité. Ou utilisez l'outil de mappage de la relation objet pour éviter un grand nombre de code ennuyeux, mais ils ne peuvent être utilisés que dans l'accès général aux demandes.
Utilisez Java 8 pour interroger la base de données par API fonctionnelle. Par exemple, Jinq est un projet open source et quelle future API de base de données qu'il explore peut rendre la programmation fonctionnelle possible. Voici une requête de base de données utilisant Jinq:
Clients.Where (C-> C.GetCountry (). Equals ("Belgique");Ce code est presque le même que le code à l'aide d'une API de streaming. Lorsque le code s'exécute, Jinq se traduira automatiquement par un code de requête de base de données, tout comme la requête JDBC avant.
Dans ce cas, même si vous n'avez pas appris un nouveau langage de requête de base de données, vous pouvez écrire une requête de base de données efficace. Vous pouvez utiliser le même style de code pour collecter sur Java. Vous n'avez pas besoin d'un compilateur Java spécial ou d'une machine virtuelle. Toute la compilation de code et l'exécution sur Java 8 JDK ordinaire. Si votre code est faux, le compilateur les trouvera et vous le signalera, tout comme un code Java ordinaire.
Jinq prend en charge la même requête complexe que SQL92. L'algorithme du code Java de traduction dans une requête de base de données est très flexible, tant qu'il peut l'accepter, il peut traduire. Par exemple, Jinq peut traduire la requête de la base de données ci-dessous, bien qu'elle soit compliquée.
Clients .Where (C-> C.GetCountry (). ctctctctctct son travail de travail de rôle travail travail travail travail travail travail wor work work travailleur.
Comme vous pouvez le voir, la programmation fonctionnelle de Java 8 est très adaptée à la requête de base de données. Et la requête est compacte et même des demandes compliquées peuvent être compétentes.
Opération interne
Mais comment travaillez-vous? Comment les compilateurs Java ordinaires peuvent-ils convertir le code Java en requête de base de données? Quelle est la particularité de Java 8 pour rendre cela possible?
La clé pour prendre en charge ces nouveaux IP de base de données qui prennent en charge ces fonctions est une méthode d'analyse bytecode appelée "exécution symbolique". Bien que votre code soit compilé par un compilateur Java ordinaire et s'exécute dans une machine virtuelle Java ordinaire, Jinq peut analyser et créer une requête de base de données à partir de celui-ci lorsque vous êtes compilé du code Java. Lorsque vous utilisez l'API Java 8 Streams, il est souvent constaté que lors de l'analyse des fonctions courtes, l'effet de travail de l'exécution symbolique est le meilleur.
Pour comprendre comment fonctionne cette exécution symbolique, le moyen le plus simple est d'utiliser un exemple. Vérifions comment les requêtes suivantes sont converties en langage de requête SQL par Jinq:
Clients .Where (C-> C.GetCountry (). Equals ("Belgique")))))) Initialement, Variables Clients est une collection, et sa requête de base de données correspondante est:
Sélectionner * parmi les clients C
Ensuite, la méthode où () est appelée, et une fonction y est transmise. Dans la méthode où (), Jinq ouvre le fichier .class de cette fonction pour obtenir le code d'octet compilé par cette fonction pour l'analyse. Dans cet exemple, n'utilisez pas le code d'octet réel, utilisons des instructions simples pour représenter le code d'octets de cette fonction:
d = c.getCountry () e = "Belgique" E = D.Equals (e) Retour E
Ici, nous supposons que la fonction a été compilée par le compilateur Java dans ces quatre instructions. Lorsque la méthode où () est appelée, Jinq les voit. Comment Jinq peut-il comprendre ces code?
Jinq est analysé en exécutant du code. Mais Jinq n'exécute pas le code directement. Il s'agit d'un code d'opération "abstrait": sans variables réelles et valeurs réelles, Jinq utilise des symboles pour indiquer toutes les valeurs lors de l'exécution du code. C'est pourquoi cette analyse est appelée "exécution symbolique".
Jinq exécute chaque instruction et suit tout ce que tous les effets secondaires ou le code changent pendant l'état du programme. Ce qui suit est un graphique qui montre tous les effets secondaires trouvés lorsque Jinq effectue les quatre lignes de code en exécution symbolique.
Exemple d'exécution symbolique
Dans la figure, vous pouvez voir qu'après l'exécution de la première instruction, Jinq a découvert deux effets secondaires: la variable D a changé et la méthode client.getCountry () a été appelée. Parce que c'est une exécution symbolique, la variable D ne donne pas une valeur réelle d'un réel, tel que "USA" ou "Danemark", qui est attribué à une valeur symbolique de C.GetCountry ().
Une fois que toutes ces instructions sont exécutées, Jinq a rationalisé les effets secondaires. Étant donné que les variables D et E sont des variables locales, toutes les variables seront rejetées après la sortie de la fonction, de sorte que ces effets secondaires peuvent être ignorés. Jinq sait également que Customer.GetCountry () et String.equals () ne modifient aucune variable ni n'affiche une sortie, de sorte que ces méthodes peuvent être ignorées. En conséquence, Jinq peut conclure que cette fonction ne produira qu'un seul rôle, et il renverra C.getCountry ().
Une fois que Jinq a compris les fonctions qui lui ont été transmises dans la méthode où (), elle peut mélanger les connaissances de la requête de base de données et donner une nouvelle requête de base de données dans la collection de clients.
Générer une requête de base de données
C'est ainsi que Jinq génère une requête de base de données à partir de votre code. L'utilisation de l'exécution symbolique signifie que cette méthode est assez puissante pour différents modes de code à partir de différents compilateurs Java. Si le code rencontré par Jinq a les effets secondaires qui ne peuvent pas être convertis en une requête de base de données, Jinq gardera votre code inchangé. Parce que tout est écrit en code Java normal, Jinq peut exécuter ces code directement et votre code produira les résultats attendus.
Cet exemple de traduction simple devrait vous permettre de comprendre comment les fonctionnalités de traduction. Vous pouvez être sûr que ces algorithmes peuvent générer correctement les requêtes de base de données à partir de votre code.
Belle perspective
J'espère que je vous ai permis de goûter une nouvelle façon de travailler sur la base de données apportée par Java 8 à Java. La programmation fonctionnelle prise en charge par Java 8 vous permet d'écrire du code pour la base de données pour écrire du code pour la collection Java. Il est à espérer que les API de base de données existantes seront étendues pour prendre en charge ces types de requête.