J'ai essayé de résumer Java 8 maintenant

introduction

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.

Fonctionnalités ajoutées fréquemment utilisées

--Lambda

Regardons de plus près.

Lambda

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.

Quel est le type lambda en premier lieu?

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 **.

Quand ressentez-vous le goût de style lambda?

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.

Une scène où vous pouvez ressentir la description et le goût réels

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.

  1. Utilisez ʻofNullable () pour obtenir ʻOptional.empty () si la valeur de retour de sampleDao.selectById () est nulle, ou ʻOptional `si vous pouvez obtenir quelque chose. Je le retournerai.
  2. ʻorElseThrow () 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!

point important

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.

Une scène où vous pouvez ressentir la description et le goût réels

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.

  1. Récupérez le nom de l'entité récupéré dans la liste avec map () et renvoyez-le au flux. ** (Fonctionnement intermédiaire) **
  2. 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.

finalement

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

J'ai essayé de résumer Java 8 maintenant
J'ai essayé de résumer l'apprentissage Java (1)
J'ai essayé de résumer les expressions Java lambda
J'ai essayé de résumer le support d'iOS 14
J'ai essayé d'interagir avec Java
~ J'ai essayé d'apprendre la programmation fonctionnelle avec Java maintenant ~
J'ai essayé de résumer les bases de kotlin et java
J'ai essayé de résumer les méthodes utilisées
J'ai essayé de résumer l'API Stream
Qu'est-ce que Docker? J'ai essayé de résumer
J'ai essayé de résumer les méthodes de Java String et StringBuilder
J'ai essayé de résumer sur JVM / garbage collection
J'ai essayé de faire une authentification de base avec Java
java j'ai essayé de casser un simple bloc
J'ai essayé de sortir quatre-vingt-dix-neuf en Java
J'ai essayé de casser le bloc avec java (1)
[Introduction à Java] J'ai essayé de résumer les connaissances que j'estime essentielles
J'ai essayé Drools (Java, InputStream)
J'ai essayé d'utiliser Java REPL
Java8 pour démarrer maintenant ~ Facultatif ~
J'ai essayé la métaprogrammation avec Java
J'ai essayé d'implémenter TCP / IP + BIO avec JAVA
J'ai essayé d'implémenter la notification push Firebase en Java
[Java 11] J'ai essayé d'exécuter Java sans compiler avec javac
[Java] J'ai essayé de résoudre le problème de rang B de Paiza
J'ai essayé de faire fonctionner SQS en utilisant AWS Java SDK
# 2 [Note] J'ai essayé de calculer quatre-vingt-dix-neuf avec Java.
J'ai essayé de créer une compétence Clova en Java
J'ai essayé de créer une fonction de connexion avec Java
J'ai essayé de résumer divers link_to utilisés cette fois
J'ai essayé d'implémenter Sterling Sort avec Java Collector
[Java] J'ai essayé de mettre en œuvre la recherche de produits de l'API Yahoo
J'ai essayé d'implémenter la méthode de division mutuelle d'Eugrid en Java
J'ai essayé de découvrir ce qui avait changé dans Java 9
J'ai essayé d'utiliser anakia + Jing maintenant
J'ai essayé de créer un environnement de développement java8 avec Chocolatey
J'ai essayé de mâcher C # (indexeur)
J'ai essayé de moderniser une application Java EE avec OpenShift.
[JDBC] J'ai essayé d'accéder à la base de données SQLite3 depuis Java.
J'ai essayé la communication UDP avec Java
J'ai essayé d'expliquer la méthode
Je souhaite utiliser l'API Java 8 DateTime lentement (maintenant)
J'ai essayé de faire coexister Java Optional et la clause de garde
J'ai essayé le framework Java "Quarkus"
J'ai brièvement résumé la grammaire de base de Ruby
J'ai essayé d'utiliser l'API Java8 Stream
J'ai essayé de résumer les applications et les outils de développement personnellement utiles (outils de développement)
J'ai essayé de convertir une chaîne de caractères en un type LocalDate en Java
J'ai essayé d'utiliser JWT en Java
J'ai essayé d'utiliser Dapr en Java pour faciliter le développement de microservices
J'ai créé un client RESAS-API en Java
Java 8 ~ Stream API ~ pour commencer maintenant
C # (polymorphisme: polymorphisme)
J'ai essayé de résumer l'orientation de l'objet à ma manière.
J'ai essayé d'utiliser le mémo Java LocalDate
J'ai essayé d'expliquer Active Hash
J'ai essayé d'utiliser Google HttpClient de Java