Cela fait environ deux mois que Java 11 a été officiellement publié. Java change de plusieurs manières, comme le paiement du JDK, Maintenant, revenons aux bases et résumons Java 8. Je décrirai principalement les fonctions qui sont souvent utilisées.
À propos, l'auteur n'a qu'une expérience Java 7 jusqu'au site précédent L'histoire de Java 8 est d'environ six mois.
--Lambda
Regardons de plus près.
Il semble que cela s'appelle également Clôture sous un autre nom. (Je n'ai jamais vu personne appeler ça) Voyons la description réelle de ce à quoi il ressemble.
Sample.java
(x, y) -> {return x + y;}
/*
(Arguments de la méthode à implémenter) -> {En traitement}
*/
... C'est pourquoi c'est comme ça.
Quelle est l'expression lambda en premier lieu? ** Une fonction qui vous permet de décrire de manière concise l'implémentation d'une interface fonctionnelle comme une expression **.
… De plus, le mot inconnu ** interface fonctionnelle ** est sorti. En gros, considérez-le comme une interface qui n'a qu'une seule méthode abstraite implémentée [^ 1] **.
Donc pour résumer un peu plus en détail, ** Une fonctionnalité qui vous permet de décrire de manière concise l'implémentation d'une interface qui n'a qu'une seule méthode abstraite implémentée **.
Par exemple, implémentons l'interface fonctionnelle suivante.
Sample.java
@FunctionalInterface
public interface SampleInterface {
void sayHi();
}
Implémentons l'interface normalement.
SampleImpl1.java
public class SampleImple1 {
public void greeting() {
SampleInterface sample = new SampleInterface() { //Implémenter l'interface
void sayHi() {
System.out.println("Hi!"); //Décrivez le processus que vous souhaitez mettre en œuvre
}
}
sample.sayHi(); //Exécution du traitement
}
}
Je veux juste vous dire bonjour, mais c'est très désagréable de devoir prendre la peine de mettre en place un nouveau traitement. Utilisons l'expression lambda.
SampleImpl2.java
public class SampleImpl2 {
public void greeting(String name) {
SampleInterface sample = () -> System.out.println("Hi!"); //La description de la mise en œuvre et du traitement peut être combinée
sample.sayHi(): //Exécution du traitement
}
}
Tu ne penses pas que c'est assez propre? Être concis n'est pas seulement convivial pour l'implémenteur, mais cela rend également le code plus facile à comprendre pour le lecteur car cela élimine le besoin de descriptions redondantes. Cela peut également avoir un impact positif sur l'ensemble du projet.
Je pense qu'il est plus facile de comprendre si vous écrivez réellement le code que vous le voyez dans un article ou le lisez dans un livre comme celui-ci. Si vous ne l'avez pas encore écrit ou si vous ne l'avez pas vu sur le terrain, écrivez-le! !!
Optional Facultatif qui m'est toujours redevable. Personnellement, je trouve cela très pratique.
De quel type de fonction s'agit-il? C'est une fonction qui indique que ** l'objet peut être nul **. Je laisserai les fonctions (méthodes) détaillées réelles à Référence officielle. Afin de lire le code introduit cette fois, j'aimerais que vous ne prépariez que les méthodes suivantes.
Jetons un coup d'œil à la scène où vous ressentez réellement la description et le goût.
Examinons un cas où vous souhaitez créer une référence à la base de données et lancer votre propre exception si vous ne pouvez rien obtenir.
Tout d'abord, si vous n'avez pas utilisé Facultatif.
OptionalService1.java
SampleEntity sampleEntity = sampleDao.selectById(id); //Exécuter la référence DB
if (isNull(sampleEntity)) { //Si l'entité est nulle
throw new ApplicationException("errorCode", "Impossible d'obtenir la valeur de la base de données"); //Lancer une exception
}
C'est une catégorie relativement simple, mais je déteste avoir à écrire une déclaration if. Dans cet exemple, vous n'avez pas à vous soucier de l'imbrication, S'il s'agit d'un code de champ, l'imbrication est déjà assez profonde, et même si le branchement peut sembler gênant.
Maintenant, utilisons facultatif.
OptionalService2.java
Optional<SampleEntity> sampleEntity = Optional.ofNullable(sampleDao.selectById(id))
.orElseThrow(() -> new ApplicationException("errorCode", "Impossible d'obtenir la valeur de la base de données"));
… Cela s'est terminé en une seule ligne. Ça fait un peu plus longtemps. .. Et il sort dans un style lambda. Cela sort parce que c'est pratique. on ne peut rien y faire.
Voici une brève explication.
pour obtenir ʻOptional.empty ()
si la valeur de retour de sampleDao.selectById ()
est nulle, ou ʻOptional lève une exception lorsque le résultat de l'acquisition est ʻOptional.empty ()
.Donc, si aucune exception n'est levée ici, il est certain que sampleEntity
n'est pas Optional.empty (). Facile à comprendre!
Si vous avez supprimé la référence que j'ai introduite plus tôt, vous le saurez.
D'autres fonctionnalités utiles telles que «map» et «ou ElseGet» sont fournies. Utilisons-le!
Comme mentionné précédemment, Optional exprime qu'il peut être ** null **. La méthode est exprimée par la méthode lors de l'encapsulation avec Optional ou lors de la récupération de la valeur à l'intérieur.
--Méthode pour envelopper facultatif --of… lance une exception si l'objet d'encapsulation est nul - ofNullable --Méthode pour récupérer la valeur facultative --get ... Lève une exception si l'option facultative que vous essayez de récupérer est vide - orElseGet - orElseThrow
Par conséquent, ** n'utilisez pas ofNullable pour les objets qui ne peuvent jamais être null (par exemple, les colonnes qui ne sont PAS NULL dans les contraintes DB), mais utilisez **. Cela permettra à quiconque verra le code plus tard de comprendre que "cet élément est peu susceptible d'être nul" **. Vous n'êtes pas obligé d'écrire des tests inutiles.
Après tout, quelle que soit l'utilité de la fonction fournie, elle ne sera efficace que si l'utilisateur la comprend. (Commandement)
Stream Le nom est cool. Stream est une ** fonction qui vous permet d'écrire des opérations sur des tableaux et des listes de manière concise **. En outre, des fonctions détaillées ont été transférées à Référence officielle. J'aimerais que vous vous prépariez pour ce qui suit.
Supposons qu'il existe un processus pour sortir les noms qui peuvent être collectivement acquis de la base de données dans l'ordre.
Je vais l'essayer avec la déclaration étendue pour.
ForSample.java
for (SampleEntity entity : entityList) { //Obtenez le contenu de la liste un par un
System.out.println(entity.getName());
}
Je ne pense pas qu'il y ait beaucoup de traitement pour sortir le nom d'une personne sans réfléchir calmement. Parce que c'est un exemple. Le nid sera à nouveau plus profond. Je déteste.
Utilisons Stream.
StreamSample.java
entityList.stream.map(x -> x.getName()).forEach(System.out::println);
Cela s'est également terminé en une seule ligne. Et c'est court.
Une brève explication.
map ()
et renvoyez-le au flux. ** (Fonctionnement intermédiaire) **forEach ()
exécute` System.out :: println 'pour chaque élément du flux. ** (Opération de terminaison) **Je pense que ce n'est pas grave si vous pouvez reconnaître à peu près que ** l'opération intermédiaire traite les éléments du tableau et de la liste, les stocke dans le flux et que l'opération de terminal les exécute collectivement pour le flux **.
Il existe d'autres méthodes trop pratiques, telles que filter ()
, sorted ()
et distinct ()
.
Essayez également de l'utiliser.
Quand je l'écris à nouveau, beaucoup de choses qui peuvent facilement décrire des fonctions existantes sont ajoutées plutôt que de nouvelles fonctions. Je pensais aussi que je l'utilisais beaucoup.
Simple est le meilleur pour les gens formidables! Je pense que le simple fait de lire et d'écrire ces derniers vous fera ressembler davantage à un ingénieur!
Jusqu'à la fin Merci d'avoir lu! Nous attendons vos commentaires et suggestions avec impatience! !!
[^ 1]: Strictement différent. Pour plus d'informations, cliquez ici [https://qiita.com/lrf141/items/98ffbeaee42d30cca4dc#%E9%96%A2%E6%95%B0%E5%9E%8B%E3%82%A4%E3 % 83% B3% E3% 82% BF% E3% 83% BC% E3% 83% 95% E3% 82% A7% E3% 83% BC% E3% 82% B9% E3% 82% 92% E7% 90 Voir% 86% E8% A7% A3% E3% 81% 99% E3% 82% 8B).
Recommended Posts